NSString为啥用copy而不建议用Strong

说个情景就明白了。。

看下面一段代码

先定义个不可变的字符串,采用strong

@property (nonatomic, strong) NSString *name;
NSMutableString *str = [NSMutableString stringWithFormat:@"流浪的蜗牛"];
    self.name = str;
    
    NSLog(@"使用strong第一次得到的名字:%@", self.name);
    
    [str appendString:@"开发"];
    NSLog(@"使用strong第二次得到的名字:%@", self.name);

  • 注意,我们使用strong,代表只是在[NSMutableString stringWithFormat:@"流浪的蜗牛"]这个对象的引用计数上加了1,当在这个可变字符串对象的后边进行修改后,我们的不可变字符串指针指向的还是那个对象(不过他已经改变了),这跟定义的不可变是冲突的,所以某些情况会出现问题。

下面是输出

[1000:153182] 使用strong第一次得到的名字:流浪的蜗牛
2017-09-20 09:44:16.555 NSString为何要用copy?而不是strong?[1000:153182] 使用strong第二次得到的名字:流浪的蜗牛开发

用copy就不一样了,他是带有智能的色彩的,他会根据不同的情况,分别采用浅拷贝和深拷贝,实现不同的效果。

下面我们看采用copy的代码

同样先定义一个copy属性的不可变字符串

@property (nonatomic, copy) NSString *name1;
NSMutableString *str1 = [NSMutableString stringWithFormat:@"流浪的蜗牛123"];
    self.name1 = str1;
    
    NSLog(@"使用copy第一次得到的名字:%@", self.name1);
    
    [str1 appendString:@"开发123"];
    NSLog(@"使用copy第二次得到的名字:%@", self.name1);

[1000:153182] 使用copy第一次得到的名字:流浪的蜗牛123
2017-09-20 09:44:16.556 NSString为何要用copy?而不是strong?[1000:153182] 使用copy第二次得到的名字:流浪的蜗牛123

可以看到,当采用copy的时候,给一个不可变字符串赋值一个可变字符串的时候,会默认采用深拷贝,重新复制出一个完全相同的对象来,所以即使改变str1,但是self.name1不会受到影响。

同理如果赋值是一个不可变的对象,那就是浅拷贝了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容