Nsstring定义时用copy还是用strong
来源:互联网 发布:在软件广场英文 编辑:程序博客网 时间:2024/05/20 13:19
1.首先定义两个属性
@property (nonatomic,strong)NSString *strongStr;@property (nonatomic,copy )NSString *copyssStr;
2.然后声明一个不可变的NSSring对象,给这两个属性对象赋值,分别输出他们的指针和内存地址。
- (void)test{ NSString *string = [NSStringstringWithFormat:@"测试文字"];//注释1 self.strongStr = string; self.copyssStr = string; NSLog(@"测试文字 String: %p, %p", string, &string); NSLog(@"Strong属性 String: %p, %p",_strongStr, &_strongStr); NSLog(@"Copy 属性 String: %p, %p",_copyssStr, &_copyssStr);}
输出如下:
2017-08-10 15:37:57.409 text[58755:1219627] 测试文字 String: 0x7ae904f0, 0xbffd80ac2017-08-10 15:37:57.409 text[58755:1219627] Strong属性 String: 0x7ae904f0, 0x7cc820f02017-08-10 15:37:57.410 text[58755:1219627] Copy 属性 String: 0x7ae904f0, 0x7cc820f4(lldb)
结果表明:不管是Strong还是Copy属性的对象,指向的地址都是同一个原来String指向的地址。
如在MRC环境,输出String的引用计数,会看到其引用计数值是3,即Strong操作和Copy操作都会使原字符串对象的引用计数值加了1。
3.接着再声明一个可变的NSSring对象,给这两个属性对象赋值,分别输出他们的指针和内存地址。
只替换注释1 代码为以下代码,输出。
NSMutableString *string = [NSMutableStringstringWithFormat:@"测试文字"];
输出如下:
2017-08-10 15:41:55.298 text[58856:1225618] 测试文字 String: 0x7d26fb40, 0xbff9c0ac
2017-08-10 15:41:55.298 text[58856:1225618] Strong属性 String: 0x7d26fb40, 0x7d062af0
2017-08-10 15:41:55.298 text[58856:1225618] Copy 属性 String: 0x7d274510, 0x7d062af4
结果输出有不同:此时Copy属性字符串已不再指向原来String对象,而是深拷贝了String字符串,且copyssString对象指向这个字符串。
在MRC环境下,输出两者的引用计数,可以看到String对象的引用计数是2,而copyssString对象的引用计数是1。
如果去修改String字符串的话,可以看到:因为strongString与原始String是指向同一对象,所以strongString的值也会跟随着改变(此时strongString的类型实际上是NSMutableString,而不是NSString);而copyssString是指向另一个对象,并不会改变。
4.最后结论
我们知道NSMutableString是NSString的子类,一个NSString指针可以指向NSMutableString对象,strongString指针指向一个可变字符串是正常的。
如上例子可以看出:
1) 当原字符串是NSString时,字符串是不可变的,不管是Strong还是Copy属性的对象,都是指向原对象,Copy操作只是做了次浅拷贝。
2) 当原字符串是NSMutableString时,Strong属性只是增加了原字符串的引用计数,而Copy属性则是对原字符串做了次深拷贝,产生一个新的对象,且Copy属性对象指向这个新的对象,且这个Copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。
3) 这里还有一个性能问题,即在原字符串是NSMutableString,Strong是单纯的增加对象的引用计数,而Copy操作是执行了一次深拷贝,所以性能上会有所差异(虽然不大)。如果原字符串是NSString时,则没有这个问题。
所以,在声明NSString属性时,到底是选择strong还是copy,可以根据实际情况来定。不过,一般我们将对象声明为NSString时,都不希望它改变,所以大多数情况下,我们建议用copy,以免因可变字符串的修改导致的一些非预期问题。
- Nsstring定义时用copy还是用strong
- NSString到底是用copy还是strong?
- 关于声明控件用weak和strong的问题&NSString用copy好还是strong
- 用NSstring时 strong 和copy的区别
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- NSString什么时候用copy,什么时候用strong
- 1024. 科学计数法
- 安卓 setBackgroundColor 无效
- Thinkphp下嵌套UEditor富文本WEB编辑器
- java常用类——Object类
- jQuery.bind事件
- Nsstring定义时用copy还是用strong
- GDB堆栈跟踪
- Android Camera从App层到framework层到HAL层的初始化过程
- MySQL可以用localhost连接,使用IP地址无法连接问题
- laravel笔记-控制器
- 本周全球游戏安全资讯精选丨阿里云河南
- 【教程】Matlab之正版静默安装教程(Linux16.04 无图形化界面)
- RANSAC算法,random sample consensus随机采样一致性算法
- 函数&作用域&闭包