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






相关文章
|
5月前
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
514 0
|
6月前
|
UED
简述a标签target属性的取值和作用
简述a标签target属性的取值和作用
63 0
|
7月前
|
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文件
127 0
|
存储 安全 编译器
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
【C++】 --- 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
【C++】 --- 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
147 0
|
JavaScript
js获取对象属性的两种方法,object.属性名,[‘属性名’ ]
js获取对象属性的两种方法,object.属性名,[‘属性名’ ]
1012 0
js获取对象属性的两种方法,object.属性名,[‘属性名’ ]
编译错误:AVFormatContext没有名为‘url’的成员
编译错误:AVFormatContext没有名为‘url’的成员
71 0
|
iOS开发
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
94 0
|
容器
解析Obj-C中的assgin,copy,retain关键字的含义。
解析Obj-C中的assgin,copy,retain关键字的含义。
99 0
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
172 0
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义

热门文章

最新文章