直接上代码
@property (nonatomic, strong) NSString *str1;
@property (nonatomic, copy) NSString *str2;
NSMutableString *str = [NSMutableString stringWithString:@"hello"];
Test *test = [[Test alloc] init];
test.str1 = str;
test.str2 = str;
[str appendString:@" world"];
NSLog(@"str1:%@ str2:%@", test.str1, test.str2); // str1:hello world str2:hello
把可变的 str 赋给 strong 修饰的、不可变的 str1,没有产生新对象,二者指向同一个地址,所以 str 的改变会影响 str1。
把可变的 str 赋给 copy 修饰的、不可变的 str2,产生了新对象,二者指向不同的地址,所以 str 的改变不会影响 str2。
注意:上面的情况是针对于当把NSMutableString赋值给NSString的时候,才会有不同,如果是赋值是NSString对象,那么使用copy还是strong,结果都是一样的,因为NSString对象根本就不能改变自身的值,他是不可变的。
把一个对象赋值给一个属性变量,当这个对象变化了,如果希望属性变量变化就使用strong属性,如果希望属性变量不跟着变化,就是用copy属性。
由此可以看出:
对源头是NSMutableString的字符串,strong仅仅是指针引用,增加了引用计数器,这样源头改变的时候,用这种strong方式声明的变量(无论被赋值的变量是可变的还是不可变的),它也会跟着改变;而copy声明的变量,它不会跟着源头改变,它实际上是深拷贝。
对源头是NSString的字符串,无论是strong声明的变量还是copy声明的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝。
另外说明一下,这两者对内存计数的影响都是一样的,都会增加内存引用计数,都需要在最后的时候做处理。
转载自
http://blog.csdn.net/qq_18425655/article/details/51373611
https://blog.csdn.net/huang512715681/article/details/73293357
网友评论