strong和copy的区别

之前在开发的过程中,对定义类的属性用stong还是copy总是有一点迷惑,现在结合代码来巩固一下认知。
定一一个Person类,类中定义两个属性,分别用stongcopy修饰。

#import <Foundation/Foundation.h>
@interface Person : NSObject

@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyString;

@end

在定义一个可变字符串,分别赋值给这两个属性,然后改变可变字符串的值,看看有什么变化。


先测strong

    Person *person = [[Person alloc] init];
    NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
    person.strongString = name;
    NSLog(@"name没改之前person.name=%@",person.strongString);
    [name setString:@"王武"];
    NSLog(@"name改之后person.name=%@",person.strongString);
    NSLog(@"name=%@,%p",name,&name);
屏幕快照 2017-12-24 下午10.11.21.png

从输出结果我们可以看到person.strongString的值在name被修改之后烨跟着修改了。根据结果知道person.strongString和name引用同一个内存地址。


现在测copy

 NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
 person.cpyString = name;
 NSLog(@"name没改之前person.cpyString=%@",person.cpyString);
[name setString:@"王武"];
 NSLog(@"name改之后person.cpyString=%@",person.cpyString);
 NSLog(@"name=%@,%p",name,&name);

屏幕快照 2017-12-24 下午10.18.21.png

输出结果是在name没有改变之后,person.cpyString没有改变。所以nameperson.cpyString没有引用同一个内存地址。


总结

  1. 当原字符串是NSString时,字符串是不可变的,不管是strong还是copy属性的对象,都是指向原对象。
  2. 当原字符串是NSMutableString时,strong属性只是增加了原字符串的引用计数,而copy属性则是对原字符串做了次深拷贝,产生一个新的对象,且copy属性对象指向这个新的对象,且这个Copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。(总结原文地址http://blog.csdn.net/xdrt81y/article/details/63251879)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容