如何做到将可变数组进行实实在在的深拷贝--->容器类对象拷贝并且对象内部元素的拷贝

首先说下我的需求:在A控制器,我有一个可变的自定义模型数组, 我要跳转到B控制器进行编辑的时候,我传入该模型数组.在B控制器我进行编辑,然后保存的时候把编辑后的数组逆传回去

刚开始,没觉得哪里不对,后来发现在B控制器只要我改动了原来的数据,即使不点击保存,而是直接pop掉B控制器返回A控制器,我的模型数据还是会被改变,原因是我在编辑界面是直接拿着传入的模型数组对象进行编辑,所以,要想"保存"与"取消"分开,就不能直接拿着传入的模型数组对象进行编辑.  这个时候我们要做的是深拷贝一份数据出来

  在Objective-C中并不是所有的类都支持拷贝;只有遵循NSCopying协议的类,才支持copy拷贝,只有遵循NSMutableCopying协议的类,才支持mutableCopy拷贝。如果没有遵循拷贝协议,拷贝时会出错

   如果我们想再我们自定义的类中支持copy和mutableCopy那么我们就需要使我们定义的类遵循NSCopying和NSMutableCopying协议,  然后再重写-(id) copyWithZone : (NSZone *) zone  和 -(id)mutableCopyWithZone : (NSZone *) zone

#import "SkuKeepingModel.h"

@interface SkuKeepingModel ()<NSCopying,NSMutableCopying>

@implementation SkuKeepingModel

- (id)copyWithZone:(NSZone *)zone
{
    SkuKeepingModel *newModel = [[self class] allocWithZone:zone];
    newModel.keepingid = _keepingid;
    newModel.productid = _productid;
    newModel.reftable = _reftable;
    newModel.refrecordid = _refrecordid;
    newModel.keepingname = _keepingname;
    newModel.portrait = _portrait;
    newModel.quantity = _quantity;
    newModel.marketprice = _marketprice;
    newModel.discountprice = _discountprice;
    newModel.uunitprice = _uunitprice;
    newModel.soldcount = _soldcount;
    newModel.recordstatus = _recordstatus;
    newModel.createdate = _createdate;
    newModel.modifydate = _modifydate;

    return newModel;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
    SkuKeepingModel *newModel = [[self class] allocWithZone:zone];
    newModel.keepingid = _keepingid;
    newModel.productid = _productid;
    newModel.reftable = _reftable;
    newModel.refrecordid = _refrecordid;
    newModel.keepingname = _keepingname;
    newModel.portrait = _portrait;
    newModel.quantity = _quantity;
    newModel.marketprice = _marketprice;
    newModel.discountprice = _discountprice;
    newModel.uunitprice = _uunitprice;
    newModel.soldcount = _soldcount;
    newModel.recordstatus = _recordstatus;
    newModel.createdate = _createdate;
    newModel.modifydate = _modifydate;

    return newModel;
}

在B控制器弄个 属性来拷贝传入的模型数组

@property (strong, nonatomic) NSMutableArray <SkuKeepingModel *> *tempSkuKeepingModels;

数组一传入B控制器马上进行拷贝  (是连容器内的元素也进行拷贝的哦)

SMutableArray *tempArr = [[NSMutableArray alloc] initWithArray:self.skuKeepingModels copyItems:YES];
self.tempSkuKeepingModels = tempArr;

然后,你在该控制器拿的是拷贝后的另外一个对象进行编辑了

其实利用归档解档的操作也可以实现完全拷贝,

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.skuKeepingModels];
NSMutableArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];

当然了,前提条件是你重写了这两个方法

- (id) initWithCoder: (NSCoder *)coder
- (void) encodeWithCoder: (NSCoder *)coder
- (id) initWithCoder: (NSCoder *)coder
{
    if (self = [super init])
    {

        self.keepingid = [coder decodeObjectForKey:@"keepingid"];
        self.productid = [coder decodeObjectForKey:@"productid"];        .        .        .        .
    }
    return self;
}

- (void) encodeWithCoder: (NSCoder *)coder
{
    [coder encodeObject:self.keepingid forKey:@"keepingid"];
    [coder encodeObject:self.productid forKey:@"productid"];    .    .    .    .
}

这里顺便说下,数据库返回的字段经常都会直接有 id 命名的   因为id是关键字 碰到这种情况我要进行key的替换  比如我们重命名为_id

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    if ([key isEqualToString:@"id"]) {
        self._id = value;
    }
}
时间: 2024-08-08 14:54:19

如何做到将可变数组进行实实在在的深拷贝--->容器类对象拷贝并且对象内部元素的拷贝的相关文章

OC可变数组的创建与简单应用

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { //NSMutableArray * array1 = [[NSMutableArray alloc]initWithObjects:@"one",@"two",@"three", nil]; NSArray * array = @[@"1",@"2&qu

Objective - C NSArray不可变数组和NSMutableArray可变数组

OC中存储数据最常用 的两个容器就是数组和字典,而作为最常用的,应该了解这所有的特点,及用法. OC中的数组是一个容量,有序的管理了一系列元素,并且存放在数组里的元素,必须是对象类型. 不可变数组,见名知意,不可改变的,只要创建成功之后都不能改变数组容量,元素. 创建一个不可变数组对象 //1.初始化方法(多个对象用逗号隔开,并且最后一个对象与nil之间也要有逗号) NSArray *array1 = [[NSArray alloc] initWithObjects:@"zhonger"

objective-c可变数组

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 1 #pragma mark ---------------可变数组-----------------  2 //        可以在数组里面进行增删改的操作  3 //  4 //        可变数组与数组的关系:可变数组是数组的子类,  5 //      

可变数组NSMutableArray

//NSMutableArray 继承至 NSArray // NSArray * array = @[]; //1.创建可变数组 NSMutableArray * array = [[NSMutableArray alloc] initWithCapacity:0]; //使用addObject 动态给数组中增加元素 /* [array addObject:@"one"]; [array addObject:@"two"]; [array addObject:@&

Objective-C 数组与可变数组

知识点 1.NSArray 类的重点函数使用 2.NSMutableArray 类的重点函数使用 3.字符串的分割和拼接 ============================ NSArray,    NSMutableArray 1.[需要理解的知识] 1.1 C语言中数组 1. 相同数据类型的集合: int a[10]; float b[20]; char c[30]; 2. 数组地址是连续; 1.OC数组和c数组的区别 1.NSArray是个类 数组是对象: 存储也是对象: 2.数组不能

Objective-C 数组、可变数组

数组的使用方式 下面是数组:类型NSArray 1 #import <UIKit/UIKit.h> 2 #import "AppDelegate.h" 3 4 int main(int argc, char * argv[]) { 5 6 // 通过@符号创建数组 7 NSArray *arr = @[@"Hello",@"jinpangpang"]; 8 9 // 通过工厂方法创建数组 10 NSArray *arr2 = [NSA

OC-NSArray-NSMutableArray-数组-可变数组

1,OC语言和c语言的数组区别     oc语言的数组只能存储对象指针,不能存储基本类型 2,数组的创建 (1),initWithObjects:  initWithObject (2)@[@"jack"...]; (2),initWithArray: (3),arrayWithObjects:   arrayWithObject (4),arrayWithArray: 3,数组常用方法 (1),获取元素个数:count  [arr count]     arr.count (2),通

NSArray与NSMutableArray 数组与可变数组的创建和遍历 复习

1.NSArray 是一个父类,NSMUtableArray是其子类,他们构成了OC的数组. 2.NSArray的创建 NSArray * array = [[NSArray alloc]initWithObjects:@"one",@"two",@"three",@"four good",nil];//用对象初始化一个数组,这里是任意四个对象,不一定是字符串.//OC中的数组,不是真正的数组,这是一个链表,nil的作用正是表

可变数组集合ArrayList

List 接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小.(此类大致上等同于 Vector 类,除了此类是不同步的.) 每个ArrayList实例都有一个容量,默认长度是10,ArrayList将添加的对象实质上 是保存在Object数组中,当保存对象的数量足够多且达到容器长度的最大值时,ArrayList 会进行扩容,每次扩容大小的当前数组长度的1/2,保存的元素可以是Nu