为什么要优先使用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,不会再影响字符串副本值,这就是一般情况下我们希望的结果。






相关文章
|
1月前
|
存储 编译器 C++
36对象的赋值和复制
36对象的赋值和复制
13 0
|
1月前
|
JavaScript
为什么data属性是一个函数而不是一个对象?
为什么data属性是一个函数而不是一个对象?
47 1
|
11月前
|
存储 安全 算法
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
lodash分配对象的属性,忽略相同属性的值
lodash分配对象的属性,忽略相同属性的值
85 0
lodash创建一个函数属性名称的数组,包含继承属性
lodash创建一个函数属性名称的数组,包含继承属性
66 0
|
iOS开发
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
73 0
|
容器
解析Obj-C中的assgin,copy,retain关键字的含义。
解析Obj-C中的assgin,copy,retain关键字的含义。
69 0
|
JavaScript
js获取对象属性的两种方法,object.属性名,[‘属性名’ ]
js获取对象属性的两种方法,object.属性名,[‘属性名’ ]
962 0
js获取对象属性的两种方法,object.属性名,[‘属性名’ ]
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
140 0
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
|
iOS开发
iOS - 修改readonly修饰的属性
readonly:只读属性,只生成getter方法,也就是说只能访问变量,不能修改。
iOS - 修改readonly修饰的属性