開發(fā)中會(huì)遇到控制器A傳遞model到控制器B的情況,但是如果直接賦值的話,控制器B更改了model數(shù)據(jù),控制器Amodel數(shù)據(jù)也會(huì)改變.因?yàn)榭刂破鰽和B操作的model實(shí)質(zhì)上是同一塊內(nèi)存地址

要避免這種情況賦值時(shí)就要對model對象進(jìn)行深拷貝.也就是新開辟一個(gè)內(nèi)存地址,再復(fù)制一份內(nèi)容.
首先要你要給你需要深拷貝的自定義對象遵守NSCopying,NSMutableCopying協(xié)議,不然當(dāng)DemoModel對象執(zhí)行copy和mutableCopy時(shí)會(huì)崩潰!
.h文件中
@interface DemoModel : NSObject<NSCopying,NSMutableCopying>
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,? copy) NSString * name;
.m文件中 實(shí)現(xiàn)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;
}
這樣我們賦值時(shí)需要深拷貝的對象調(diào)用copy或mutableCopy方法就會(huì)跳轉(zhuǎn)到我們上面實(shí)現(xiàn)的copyWithZone或mutableCopyWithZone對對象進(jìn)行了深拷貝.我們打印地址會(huì)發(fā)現(xiàn)地址已經(jīng)改變了.
