iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
2017-11-20 19:19
423 查看
大家都听知道,属性字符串要用copy来修饰,防止被改变。
但是什么情况下不用copy修饰会被改变呢?
博主先这么做:
其实并没有改变。但是,在self.haha = string;之后,self.haha和string的地址肯定一样,在string = @”hello world!”;之后,他们的地址就已经不一样了。所以这种普通的赋值不会引起属性的改变,即使赋值对象是可变字符串。
以上代码重新操作string能引起self.haha改变的操作并不多,博主核实有以下几种:
好奇的小伙伴们自己试试看,他们有一个共同点,那就是都是属于NSMutableString的方法,然后,不用copy修饰的字符串属性就变得不安全了。如果用NSString的方法来操作必须进行赋值才能改变,否则连可变字符串都不会改变,比如:
若是不赋值给新的对象,NSString的方法不会引起NSMutableString值的改变,这也是博主上一篇博客里说到的问题,有兴趣可以看看上一篇说的什么。
细节决定成败,这里的知识点很简单,但是不小心的话很可能找不到问题所在,所以就拿出来大家一起分享下,喜欢的看管欢迎关注或加群讨论。
但是什么情况下不用copy修饰会被改变呢?
博主先这么做:
NSMutableString *string = [NSMutableString stringWithFormat:@"hello world"]; self.haha = string; NSLog(@"%@",self.haha); string = @"hello world!"; NSLog(@"%@",self.haha); 打印结果: 2017-11-20 19:09:38.113780+0800 11[7686:418768] hello world 2017-11-20 19:09:38.113940+0800 11[7686:418768] hello world
其实并没有改变。但是,在self.haha = string;之后,self.haha和string的地址肯定一样,在string = @”hello world!”;之后,他们的地址就已经不一样了。所以这种普通的赋值不会引起属性的改变,即使赋值对象是可变字符串。
以上代码重新操作string能引起self.haha改变的操作并不多,博主核实有以下几种:
// [string appendString:@"asjbdkabskjd"]; // [string deleteCharactersInRange:NSMakeRange(0, 1)]; // [string insertString:@" the" atIndex:5]; // [string replaceCharactersInRange:NSMakeRange(0, 1) withString:@"?"]; // [string setString:@"change"]; // [string appendFormat:@"!"];
好奇的小伙伴们自己试试看,他们有一个共同点,那就是都是属于NSMutableString的方法,然后,不用copy修饰的字符串属性就变得不安全了。如果用NSString的方法来操作必须进行赋值才能改变,否则连可变字符串都不会改变,比如:
[string substringWithRange:NSMakeRange(0, 1)]; 和 NSString *subString = [string substringWithRange:NSMakeRange(0, 1)];
若是不赋值给新的对象,NSString的方法不会引起NSMutableString值的改变,这也是博主上一篇博客里说到的问题,有兴趣可以看看上一篇说的什么。
细节决定成败,这里的知识点很简单,但是不小心的话很可能找不到问题所在,所以就拿出来大家一起分享下,喜欢的看管欢迎关注或加群讨论。
相关文章推荐
- iOS开发-------属性用copy、strong修饰的区别
- iOS开发-------属性用copy、strong修饰的区别
- iOS开发-------属性用copy、strong修饰的区别
- IOS中属性的关键修饰词:strong weak assign copy retain等。。
- iOS开发-属性字符串NSAttributeString与NSString相互转换
- 属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在哪种情况下用?
- [iOS]NSString到底使用Copy还是使用Strong属性,有什么区别
- iOS开发之详解@property属性(copy,strong,weak,nonatomic,readwrite等)
- iOS 开发 OC编程 属性和字符串
- iOS开发 - 详谈属性设置readwrite、readonly、retain、copy、assign、nonatomic
- 代码块(block)的使用---iOS4.0以后推出(声明成属性的时候,用copy修饰)
- OC中属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?
- 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用 ; nil、Nil、NULL、NSNull的区别
- readwrite, readonly, assign, retain, copy, nonatomic属性的作用? 什么情况使用copy,assign和retain?
- 用copy修饰一个可变字符串时,编译器到底做了什么
- IOS开发-UI学习-NSMutableAttributedString(带属性的字符串)的使用
- OC中属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?
- 定义属性时,什么情况使用copy、assign、retain?
- Ios应用开发(四)框架及带属性的字符串
- iOS 开发 OC编程 属性和字符串练习