對象的複制就是複制一個對象作為副本,他會開辟一塊新的記憶體(堆記憶體)來存儲副本對象,就像複制檔案一樣,即源對象和副本對象是兩塊不同的記憶體區域。對象要具備複制功能,必須實作<NSCopying>協定或者<NSMutableCopying>協定,常用的可複制對象有:NSNumber、NSString、NSMutableString、NSArray、NSMutableArray、NSDictionary、NSMutableDictionary
copy:産生對象的副本是不可變的
mutableCopy:産生的對象的副本是可變的
淺拷貝和深拷貝
淺拷貝值複制對象本身,對象裡的屬性、包含的對象不做複制
深拷貝則既複制對象本身,對象的屬性也會複制一份
Foundation中支援複制的類,預設是淺複制
對象的自定義拷貝
對象擁有複制特性,須實作NSCopying,NSMutableCopying協定,實作該協定的CopyWithZone:方法或MutableCopyWithZone:方法。
淺拷貝實作
-(id)copyWithZone:(NSZone *)zone{
Person *person = [[[self Class]allocWithZone:zone]init];
p.name = _name;
p.age = _age;
return person;
}
深拷貝的實作
-(void)copyWithZone:(NSZone *)zone{
Person *person = [[[self Class]allocWithZone:zone]init];
person.name = [_name copy];
person.age = [_age copy];
return person;
}
深淺拷貝和retain之間的關系
copy、mutableCopy和retain之間的關系
Foundation中可複制的對象,當我們copy的是一個不可變的對象的時候,它的作用相當與retain(cocoa做的記憶體優化)
當我們使用mutableCopy的時候,無論源對象是否可變,副本是可變的
當我們copy的 是一個可變對象時,複本不可變