iOS对自定义对象深拷贝

开发中会遇到控制器A传递model到控制器B的情况,但是如果直接赋值的话,控制器B更改了model数据,控制器Amodel数据也会改变.因为控制器A和B操作的model实质上是同一块内存地址


相同的地址

要避免这种情况赋值时就要对model对象进行深拷贝.也就是新开辟一个内存地址,再复制一份内容.

首先要你要给你需要深拷贝的自定义对象遵守NSCopying,NSMutableCopying协议,不然当DemoModel对象执行copy和mutableCopy时会崩溃

.h文件中

@interface DemoModel : NSObject

@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对对象进行了深拷贝.我们打印地址会发现地址已经改变了.

地址改变了

你可能感兴趣的:(iOS对自定义对象深拷贝)