首先,如果你遇到修改数组里面的其中一个模型导致所有的模型改变了这个问题,先不管别的,你先打印下你的数组里面的模型看是否同一个,不出意外,应该和下面的一样:
你会发现,模型地址一模一样,所以问题出现了,你修改其中一个模型,其它的模型也都改变了,这怎么办呢?
先查查,添加到数组的时候是不是同一个模型?这里指的同一个模型包含整体赋值到一个新模型再添加到数组,因为这样和直接把同一个模型直接塞到数组是一个意思!这时我们要用到
copy
的方法,copy
的目的就是生成一个新的实例,然后把其成员都按原实例赋值,这正不是我们想要的结果吗?现在我们看看
copy
怎么用,在Objetive-C中,copy
实现方式是要调用一个对象的copy方法,这个对象必须遵循NSCopying
协议,这个 协议中规定了一个方法:- (id)copyWithZone:(NSZone *)zone;
我们就是通过实现这个方法给对象提供拷贝的功能。对于很多现有类,如NSString,NSDictionary...
这个方法已经实现,但是对于我们自定义的一个类,则需要为这个类提供拷贝的功能,就需要自己来手动写CopyWithZone的方法:首先在自定义类的.h
文件遵守协议<NSCopying>
,然后在.m
文件中写上方法:
- (id)copyWithZone:(NSZone *)zone
{
JhjPayMentModel *model = [[JhjPayMentModel allocWithZone:zone] init];
//我们使用了class的allocWithZone的方法创建了一个拷贝,这里假定JhjPayMentModel类中有一个 initWithPay_id: pay_name:的初始化方法,那么这样调用后就得到了一个JhjPayMentModel的副本,而且pay_id和pay_name都已经赋值好了
model.pay_id = self.pay_id;
model.pay_name = self.pay_name;
return model;
}
完成了这些操作后,现在就开始copy
了,如果我们有一个model1的实例,然后调用以下方法:
JhjPayMentModel *model2 = [model1 copy];
这样我们就成功的用上面copyWithZone的方法创建一个model1的副本,然后赋值给了model2,再添加至数组,经过这样操作,你再打印下数组里面的模型,不出意外,变成了:
可以看出,和之前对比,模型地址不同了,这下你再试下修改一个一个模型的值,其它模型的值就不会跟着变了!!!
声明: 转载请注明出处https://www.jianshu.com/p/620f3ef3fe48