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。

你可能感兴趣的:(NSString为何要用copy?而不是strong?)