为什么要优先使用copy声明NSString属性?

简介: 至于为什么要优先使用copy声明NSString属性?首先科普一下:对象在内存中都有一个入口地址,当我们取到这个对象的地址(也就是指针),可以去改变这个对象的一些属性值,而当我们再次去取这个对象,使用这个对象的属性值(我们已修改过的)时,我们会发现这个值确实变成了我们修改的值,当然,前提是需要这个对象没有被销毁,在内存中还存在。选择使用copy的理由是:NSString属性可能被传入一个NSString实例,也可能是一个NSMutableString实例。当传入了一个NSMutableString实例时,字符串的值可能会在背后悄悄变化。

至于为什么要优先使用copy声明NSString属性?首先科普一下:对象在内存中都有一个入口地址,当我们取到这个对象的地址(也就是指针),可以去改变这个对象的一些属性值,而当我们再次去取这个对象,使用这个对象的属性值(我们已修改过的)时,我们会发现这个值确实变成了我们修改的值,当然,前提是需要这个对象没有被销毁,在内存中还存在。选择使用copy的理由是:NSString属性可能被传入一个NSString实例,也可能是一个NSMutableString实例。当传入了一个NSMutableString实例时,字符串的值可能会在背后悄悄变化。

我们来举个例子看一下:

首先,声明一个Person类,有个属性name

@interface Person : NSObject
@property (strong, nonatomic) NSString *name;
@end


在另一个类中,我们有一个这样的方法:

- (void)setNameString {
 NSMutableString *personName = [NSMutableString stringWithString:@"Zhangsan"];
 Person *person = [[Perxon alloc] init];
 person.name = personName;
 [personName setString:@"Lisi"];
 NSLog(@"person name -->> %@", person.name);
}


运行后会发现,person的name是“Lisi”。如果我们更改为使用copy声明name属性,person的name变为了“Zhangsan”。当我们使用strong声明该属性,字符串的retain计数将增加1,属性与字符串指向同一个内存地址,这就意味着任何指向这个内存地址的变量都可改变这个值,本例中person变量的值改变后,name属性值也跟随变化。当我们改用copy的话,则会为Person类创建一个字符串副本(也就是copy了一份内存和personname一样),也就是说修改personname,不会再影响字符串副本值,这就是一般情况下我们希望的结果。






相关文章
|
8月前
|
存储 Java
JavaSE——方法(2/2)-方法重载、return关键字在方法中单独使用
JavaSE——方法(2/2)-方法重载、return关键字在方法中单独使用
40 4
|
8月前
|
UED
简述a标签target属性的取值和作用
简述a标签target属性的取值和作用
77 0
|
9月前
|
C++
Qt定义属性类信息报错‘Qstring‘ was not declared in this scope; did you mean ‘xxx‘?并且还有有一堆报错,问题还出现在moc文件
Qt定义属性类信息报错‘Qstring‘ was not declared in this scope; did you mean ‘xxx‘?并且还有有一堆报错,问题还出现在moc文件
162 0
|
存储 安全 编译器
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
|
JSON Java 数据库
代码重构实战-将值对象改为引用对象(Change Value to Reference)
一个数据结构中可能包含多个记录,而这些记录都关联到同一个逻辑数据结构。例如,我可能会读取一系列订单数据,其中有多条订单属于同一个顾客。遇到这样的共享关系,既能将顾客信息作为值对象看待,也能将其视为引用对象
121 0
|
iOS开发
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
103 0
|
容器
解析Obj-C中的assgin,copy,retain关键字的含义。
解析Obj-C中的assgin,copy,retain关键字的含义。
113 0
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
181 0
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
|
iOS开发
iOS - 修改readonly修饰的属性
readonly:只读属性,只生成getter方法,也就是说只能访问变量,不能修改。
iOS - 修改readonly修饰的属性
|
安全 Java Android开发
【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类/成员/方法 )
【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类/成员/方法 )
422 0
【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类/成员/方法 )