美文网首页
NSString 用copy和strong的区别

NSString 用copy和strong的区别

作者: async丶 | 来源:发表于2018-03-25 18:41 被阅读0次

    直接上代码

    @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

    相关文章

      网友评论

          本文标题:NSString 用copy和strong的区别

          本文链接:https://www.haomeiwen.com/subject/cbhkcftx.html