NSString为什么要使用copy修饰而非strong

关于NSString,NSArray,NSDictionary等拥有mutable的类型,作为属性的时候,一定要使用copy修饰符号?通过代码来演示这么做的原因

@property (nonatomic, strong) NSString *p1;

@property (nonatomic, copy) NSString *p2;

//上面为声明的两个属性,分别使用strong与copy修饰

    NSMutableString *str = [NSMutableString stringWithFormat:@"ObjectiveC"];

    self.p1= str;

    self.p2= str;

    NSLog(@"str=%p,  %p",str, &str);

    NSLog(@"strong_Str=%p,  %p", _p1, &_p1);

    NSLog(@"copy_Str=%p,  %p", _p2, &_p2);

打印输出结果如下:

打印结果

通过上述打印,对于源为可变类型那么会发现str与使用strong修饰的p1对象的地址完全是相同的;而使用copy修饰的p2对象的地址不同;可以得出copy是属于深拷贝,strong属于浅拷贝

接下来对str进行修改:

增加如下代码:

    [str appendString:@"hello"];


    NSLog(@"str    ==%@",str);

    NSLog(@"self.p1 ==%@",self.p1);

    NSLog(@"self.p2 ==%@",self.p2);

输出:

修改后输出

通过输出结果发现,使用strong修饰的属性p1输出结果被修改啦,而使用copy修饰的属性p2输出结果未被修改

再看如下代码:

     NSString *str = @"Objective-C";

    self.p1= str;

    self.p2= str;


    NSLog(@"str=%p,          %p",str, &str);

    NSLog(@"strong_Str=%p,  %p", _p1, &_p1);

    NSLog(@"copy_Str=%p,    %p", _p2, &_p2);


    str =@"hello";


    NSLog(@"str    ==%@",str);

    NSLog(@"self.p1 ==%@",self.p1);

    NSLog(@"self.p2 ==%@",self.p2);

输出如下:

nstring输出

对于源为不可变NSString,无论是copy还是strong修饰全部为浅拷贝;

综上所述:为了防止NSString属性在使用过程中被Mutable子类修改,出于安全方面的考虑对于拥有mutable子类的属性,最好使用copy修饰;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容