说个情景就明白了。。
看下面一段代码
先定义个不可变的字符串,采用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不会受到影响。
同理如果赋值是一个不可变的对象,那就是浅拷贝了。