NSString为何要用copy?而不是strong?

首先用copy可能是深复制,也可能是浅复制,浅复制不会产生新的对象,和strong的效果相同。

举个栗子:
有一个Person对象,这个对象有个属性:name

@interface Person : NSObject


@property (nonatomic, copy) NSString *name;


@end

这个时候我们要对这个name赋值:(这时有两种情况)

Person *person = [Person new];

NSMutableString *nameStr = [[NSMutableString alloc] init];

nameStr.string = @"ZhangSan";

person.name = nameStr;

这个时候我们可以修改nameStr这个对象:

[nameStr appendString:@"加点文字"];

此时,如果person的name属性不是用copy而是strong,那么这个时候person的name属性就会随着nameStr的值的改变而改变(想想一个人的名字怎么能随便改变呢),这显然破坏了封装性(在这里copy是深复制),person对象怎么可以在自己不知道的情况下,自己的name属性被修改呢。

Person *person = [Person new];

NSString *nameStr = @"LiSi";

person.name = nameStr;

这个时候不管用strong或者copy效果都是相同的,因为nameStr是不可变字符串,如果用copy也不会产生新的对象(这里是浅复制),既然是不可变字符串,当然也是不能修改的!这个时候和strong一样都只是引用计数器+1。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容