iOS之property里的copy、strong区别

2021-04-29  本文已影响0人  gykimo

原文: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指向的值也不会被改变。

image

在这里给出一道常见面试题,看了上述的讲解,这道题就能很好地理解了:

用@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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇下一篇

猜你喜欢

热点阅读