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不会受到影响。

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

你可能感兴趣的:(NSString为啥用copy而不建议用Strong)