开发中会遇到控制器A传递model到控制器B的情况,但是如果直接赋值的话,控制器B更改了model数据,控制器Amodel数据也会改变.因为控制器A和B操作的model实质上是同一块内存地址
要避免这种情况赋值时就要对model对象进行深拷贝.也就是新开辟一个内存地址,再复制一份内容.
首先要你要给你需要深拷贝的自定义对象遵守NSCopying,NSMutableCopying协议,不然当DemoModel对象执行copy和mutableCopy时会崩溃!
.h文件中
@interface DemoModel : NSObject<NSCopying,NSMutableCopying>
@property (nonatomic,assign) NSInteger age;
@property (nonatomic, copy) NSString * name;
.m文件中 实现copyWithZone mutableCopyWithZone 方法
- (id)copyWithZone:(NSZone *)zone{
DemoModel * model = [[DemoModel allocWithZone:zone] init];
model.age = self.age;//self是被copy的对象
model.name = self.name;
return model;
}
- (id)mutableCopyWithZone:(NSZone *)zone{
DemoModel * model = [[DemoModel allocWithZone:zone] init];
model.age = self.age;//self是被copy的对象
model.name = self.name;
return model;
}
这样我们赋值时需要深拷贝的对象调用copy或mutableCopy方法就会跳转到我们上面实现的copyWithZone或mutableCopyWithZone对对象进行了深拷贝.我们打印地址会发现地址已经改变了.