以前在自學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)文章,轉載請附上博文鏈接!