美文网首页
复习:string的strong和copy的区别

复习:string的strong和copy的区别

作者: 记忆岸 | 来源:发表于2016-12-29 15:47 被阅读55次
str&self.png

如图,不可变 string 从图中打印来看,并无不同

mstr&self.png

如图,可变 string 的打印,copyString的地址不一样了(深拷贝)

mstr&_.png

如图,可变 string 的打印,用成员变量 _ 去赋值,因为成员变量(_)并不具备setter、getter方法,所以无法copy(深拷贝)

结论
由于 NSMutableString 是 NSString 的子类,所以一个 NSString 指针可以指向 NSMutableString 对象,让我们的 strongString 指针指向一个可变字符串是OK的。而上面的例子可以看出,当源字符串是 NSString 时,由于字符串是不可变的,所以不管是 strong 还是 copy 属性的对象,都是指向源对象,copy 操作只是做了次浅拷贝
当源字符串是 NSMutableString 时,strong 属性只是增加了源字符串的引用计数,而 copy 属性则是对源字符串做了次深拷贝,产生一个新的对象,且 copy
属性对象指向这个新的对象。另外需要注意的是,这个 copy 属性对象的类型始终是 NSString,而不是 NSMutableString,因此其是不可变的。
这里还有一个性能问题,即在源字符串是 NSMutableString,strong 是单纯的增加对象的引用计数,而 copy 操作是执行了一次深拷贝,所以性能上会有所差异。而如果源字符串是 NSString 时,则没有这个问题。所以在声明NSString 属性时,到底是选择 strong 还是 copy,可以根据实际情况来定。不过一般我们将对象声明为 NSString 时,都不希望它改变,所以大多数情况下,我们建议用 copy,以免因可变字符串的修改导致的一些非预期问题。

参考:http://southpeak.github.io/2015/05/10/ios-techset-1/

相关文章

网友评论

      本文标题:复习:string的strong和copy的区别

      本文链接:https://www.haomeiwen.com/subject/wthpvttx.html