copy和mutableCopy的區別

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容