iOS开发不用copy修饰的字符串属性什么情况下不安全

释放双眼,带上耳机,听听看~!

大家都听知道,属性字符串要用copy来修饰,防止被改变。
但是什么情况下不用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文章

iOS开发视图设置阴影

2021-2-2 10:37:23

iOS文章

iOS开发stringByReplacingOccurrencesOfString不起作用的坑

2021-2-2 11:30:39

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索