以前在自学OC的时候和实际的项目中,都没有关注这一个小问题,一直使用Strong属性声明,也没发现项目中出现过由于NSString导致的未知Bug。某一天看到南峰子的blog,我也来测试以下看看具体区别。
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环境,输出String的引用计数,会看到其引用计数值是3,即Strong操作和Copy操作都会使原字符串对象的引用计数值加了1。
3.接着再声明一个可变的NSSring对象,给这两个属性对象赋值,分别输出他们的指针和内存地址。
只替换注释1 代码为以下代码,输出。
NSMutableString *string = [NSMutableStringstringWithFormat:@"测试文字"];
输出如下:
测试文字 String: 0x7f892bf29760, 0x7fff592ca6d8
Strong属性 String: 0x7f892bf29760, 0x7f892bc42480
Copy 属性 String: 0x7f892be7d2f0, 0x7f892bc42488
结果输出有不同:此时Copy属性字符串已不再指向原来String对象,而是深拷贝了String字符串,且copyssString对象指向这个字符串。
在MRC环境下,输出两者的引用计数,可以看到String对象的引用计数是2,而copyssString对象的引用计数是1。
如果去修改String字符串的话,可以看到:因为strongString与原始String是指向同一对象,所以strongString的值也会跟随着改变(此时strongString的类型实际上是NSMutableString,而不是NSString);而copyssString是指向另一个对象,并不会改变。
作者:Wei_vv
来源:CSDN
原文:https://blog.csdn.net/weweco/article/details/47107277
版权声明:本文为博主原创文章,转载请附上博文链接!