NSString是否可以使用assign、strong修饰,为什么不用assign,除了内存?
assign是用来修饰基本数据类型的,他不会对引用计数有任何影响,而字符串是一个对象,肯定需要设计到内存管理相关的东西,assign修饰的对象在此对象释放的时候,指针地址依然存在,不会被置为nil,这就会造成很严重的问题,也就是会产生野指针。但是用weak来修饰的话在对象释放的时候会把指针置为nil,从而避免野指针的出现
使用 strong 修饰,引用的对象是同一个,如果该对象在其他地方被修改,这里的也会同步修改。
使用 copy 修饰,可以对原有对象拷贝一份,之前对象如果被修改了,不会影响你现在持有的
当源字符串是NSMutableString时,strong只是将原字符串的引用计数加1,而copy则是对原字符串做了次深拷贝,从而生成了一个新的对象,并且copy的对象指向这个新的对象。另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是NSMutableString,如果想让拷贝过来的对象是可变的,就需要使mutableCopy
如果原字符串是NSMutableString的时候,使用strong只会增加引用计数器。但是copy会执行一次深拷贝,会造成不必要的内存浪费。而如果原字符串是NSString时,copy和strong效果一样,就不会有这个问题。
但是,一般我们声明NSString时,也不会希望它改变,所以一般情况下,建议用copy,这样可以避免NSMutableString带来的奇葩错误
本文是原创文章,完整转载请注明来自 MrXiao's Blog
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果