首先用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。