iOS之property里的copy、strong区别
原文:https://www.jianshu.com/p/bb3d0c62f5c9
Objective-C中mutableCopy和copy的理解讲述了深拷贝和浅拷贝,就容易理解property里的copy、strong了。
#import <Foundation/Foundation.h>
@interface ZJPerson : NSObject
@property (nonatomic,copy) NSString * name;
@property (nonatomic,strong) NSString * StrongName;
@end
测试如下:
NSMutableString * name = [NSMutableString stringWithFormat:@"iOS俱哥"];
ZJPerson * p = [[ZJPerson alloc]init];
p.name = name;
p.StrongName = name;
// 不能改变p.name的值,因为其内部copy新的对象
//改变了p.StrongName的值,因为StrongName和name指向了同一块内存
[name appendString:@"!!!"];
NSLog(@"p.name = %@",p.name);
NSLog(@"p.StrongName = %@",p.StrongName);
NSLog(@"name:%p,p.name:%p,p.StrongName:%p",name,p.name,p.StrongName);
注:在strong情况下,如果外部被引用的变量更改了,那里面这个值也会更改,因为两个属性指向同一块内存空间 。在这里strong 属于浅拷贝,只复制对象的指针。
为了防止外界无意间修改和name指向的值,就用copy,因为copy是生成了一份新的内存空间,所以即使指向的可变字符串改变后name指向的值也不会被改变。
在这里给出一道常见面试题,看了上述的讲解,这道题就能很好地理解了:
用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
答:用@property声明 NSString、NSArray、NSDictionary 经常使用copy关键字,是因为他们分别有对应的子类是可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。
如果我们使用是strong,那么这个属性就有可能指向一个可变对象的子类,如果这个可变对象在外部被修改了,就会影响该属性。
copy在此此特质所表达的所属关系与strong类似。
指向一个NSMutableString类的实例: 设置方法并不保留新值,而是将其“拷贝” (copy)。
指向一个NSString类的实例:是指针复制,指向同一个地址。
因为传递给设置方法的新值有可能指向一个NSMutableString类的实例。避免值有变动,所以用copy
NSMutableString是NSString的子类,表示一种可修改其值的可变字符串。
此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。如果目标是不被改变,就应该在设置新属性值时拷贝一份。
作者:iOS俱哥
链接:https://www.jianshu.com/p/bb3d0c62f5c9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。