[iOS]NSString到底使用Copy還是使用Strong屬性,有什么區(qū)別

以前在自學OC的時候和實際的項目中,都沒有關注這一個小問題,一直使用Strong屬性聲明,也沒發(fā)現(xiàn)項目中出現(xiàn)過由于NSString導致的未知Bug。某一天看到南峰子的blog,我也來測試以下看看具體區(qū)別。

1.首先分別定義這個兩個屬性 NSString。

@property (nonatomic,strong)NSString *strongStr;

@property (nonatomic,copy )NSString *copyssStr;

2.然后聲明一個不可變的NSSring對象,給這兩個屬性對象賦值,分別輸出他們的指針和內存地址。

  • (void)test{

    NSString *string = [NSStringstringWithFormat:@"測試文字"];//注釋1

    self.strongStr = string;

    self.copyssStr = string;

NSLog(@"測試文字   String: %p, %p", string, &string);

NSLog(@"Strong屬性 String: %p, %p",_strongStr, &_strongStr);

NSLog(@"Copy  屬性 String: %p, %p",_copyssStr, &_copyssStr);

}

輸出如下:

測試文字 String: 0x7fade9740800, 0x7fff507f06d8

Strong屬性 String: 0x7fade9740800, 0x7fade94adf70

Copy 屬性 String: 0x7fade9740800, 0x7fade94adf78

結果表明:不管是Strong還是Copy屬性的對象,指向的地址都是同一個原來String指向的地址。

如在MRC環(huán)境,輸出String的引用計數(shù),會看到其引用計數(shù)值是3,即Strong操作和Copy操作都會使原字符串對象的引用計數(shù)值加了1。

3.接著再聲明一個可變的NSSring對象,給這兩個屬性對象賦值,分別輸出他們的指針和內存地址。

只替換注釋1 代碼為以下代碼,輸出。

NSMutableString *string = [NSMutableStringstringWithFormat:@"測試文字"];

輸出如下:
測試文字 String: 0x7f892bf29760, 0x7fff592ca6d8

Strong屬性 String: 0x7f892bf29760, 0x7f892bc42480

Copy 屬性 String: 0x7f892be7d2f0, 0x7f892bc42488

結果輸出有不同:此時Copy屬性字符串已不再指向原來String對象,而是深拷貝了String字符串,且copyssString對象指向這個字符串。

在MRC環(huán)境下,輸出兩者的引用計數(shù),可以看到String對象的引用計數(shù)是2,而copyssString對象的引用計數(shù)是1。

如果去修改String字符串的話,可以看到:因為strongString與原始String是指向同一對象,所以strongString的值也會跟隨著改變(此時strongString的類型實際上是NSMutableString,而不是NSString);而copyssString是指向另一個對象,并不會改變。

作者:Wei_vv
來源:CSDN
原文:https://blog.csdn.net/weweco/article/details/47107277
版權聲明:本文為博主原創(chuàng)文章,轉載請附上博文鏈接!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容