關于copy 、mutableCopy 、strong三者間的關系

定義:

1.copy:不可變復制?

2.mutableCopy:可變復制

實現協議:

1.copy:實現NSCopying協議

2.mutableCopy:實現NSMutableCopying協議

副本:

1.copy:

? ? ? ? a.如果是不可變的比如NSString,只復制了指針,并沒有創建新的實例,引用計數并沒有改變,相當于retain.

? ? ? ? b.如果是可變的 比如NSMutableString, 復制了新的內容,創建了一個新的immutable!!不可變實例。

2.mutableCopy:

? ? ? ? ? ?a.如果是不可變的比如NSString, 復制內容,創建新的可變的mutable實例

? ? ? ? ? ?b.如果是可變的比如NSMutableString,復制內容,穿件新的mutable!!可變的實例。


copy與strong的區別

兩個的區別主要在于setter方法的區別,說到底就是不同修飾符對應不同的setter方法。

@property (strong, nonamatic) NSMutableString *strongString;

@property (copy, nonatomic) NSMutableString *copyString;

- (void)setStrongString:(NSMutableString *)strongString {

? ? ? ?[_strongString release];

? ? ? ?_strongString = [strongString retain];

}


- (void)setCopyString:(NSMutableString *)copyString {

? ? ? ? [_copyString release];

? ? ? ? _copyString = [copyString copy];

}

再舉個例子:

@property (strong,nonatomic) NSArray*bookArray1;

@property (copy,nonatomic) NSArray*bookArray2;

NSMutableArray*books = [@[@"book1"] mutableCopy];? ??

Person *person = [[Person alloc] init];? ?

?person.bookArray1= books;? ?

?person.bookArray2= books;? ?

?[books addObject:@"book2"];

NSLog(@"bookArray1:%@",person.bookArray1);

NSLog(@"bookArray2:%@",person.bookArray2);}

可以看到bookArray1 與可變數組books指向同一塊內容區域,books內容改變,所以bookArray1內容也隨之改變。

而bookArray2,因為使用copy,在books被改變前其實復制了books的內容到一個新的內容區域里面,后面雖然改變了books但是,由于并不是一塊地址,所以并不改變內容。

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

推薦閱讀更多精彩內容