copy和mutableCopy的區別
深拷貝和淺拷貝的區別
在OC中對象的拷貝方式有兩種:深拷貝和淺拷貝.淺拷貝:并不拷貝對象本身,僅僅是拷貝指向目標對象的指針,并沒有拷貝內容; 深拷貝:直接拷貝整個對象內容到另外一塊內存中.
總結一句話: 淺拷貝就是拷貝指針,深拷貝就是拷貝內容
系統對象的copy和mutableCopy方法
1.copy方法用于拷貝對象的副本,通常來說copy方法總是返回對象的不可變的副本.即使原來的對象是可變的.例如[NSMutableString copy] 返回的依舊是 不可變 的字符串對象
2.mutableCopy方法用于拷貝對象的可變副本 .通常來說mutableCopy方法總是返回對象的可變副本.即使被拷貝的對象是不可變的.例如:[NSString mutableCopy]返回的是 可變字符串對象
NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary分別調用copy和mutableCopy總結
拷貝的副本對象類型:
copy -->不管原來的對象是什么類型 拷貝后返回的都是 不可變對象
mutableCopy -->不管原來的對象是什么類型,拷貝后返回的都是 可變對象
是否產生新的對象:
只有不可變對象的 copy方法,才不產生新的對象,其他的都會產生新對象
拷貝的類型區分:
不產生新對象的拷貝就是淺復制,其他都是深復制
自定義對象的拷貝
自定義對象要實現copy方法,需要實現NSCopying協議和實現CopyWithZone這個協議方法.不實現的話 會報 copy方法未實現的 錯誤
自定義對象拷貝代碼實現:
@interface CopyPerson : NSObject<NSCopying> //要實現NSCopying協議
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *address;
@property (nonatomic,assign)NSInteger age;
@end
實現協議方法:
-(id)copyWithZone:(NSZone *)zone{
CopyPerson *person = [[[self class] allocWithZone:zone] init];
person.name = self.name;
person.age = self.age;
person.address = self.address;
return person;
}
使用copy:
CopyPerson *person = [[CopyPerson alloc] init];
person.name = @"xmg";
person.address = @"中國";
person.age = 24;
CopyPerson *newPerson = [person copy];
NSLog(@"newPerson.name = %@,newPerson.address = %@,newPerson.age = %ld ",newPerson.name,newPerson.address,newPerson.age); // xmg 中國 24