NSString的copy、retain、mutableCopy

  规范上说NSString用copy比较安全,我试验了一下,总结如下:

  NSString 的copy和retain效果一样,而且copy和retain出来的对象的内存地址也和源地址一样,而不是理论上copy应该开辟新地址那样,猜测原因应该是系统做了优化,因为NSString本身就不可变,所以copy没必要开辟新地址,浪费空间,这就跟NSString常量都共用一个内存地址一个道理, NSString的mutableCopy会开辟新内存地址。

  NSMutableString的copy和retain效果不一样,copy会开辟新的内存地址,原因很简单,因为NSMutableString可变,当然要开辟新地址保留copy时候的值,否则后续NSMutableString改变后copy出来的值会随之而变,NSMutableString的mutableCopy会开辟心内存地址。

  对于copy来说,如果源对象是不可变的,那么是浅拷贝,没有必要深拷贝;如果源对象可变,为了安全性,深拷贝,生成副本。

  对于mutablecopy来说,不管源对象是否可变,都是深拷贝。

  因此如果希望对象跟着源对象的值变化,那么就是用retain;如果希望对象保持独立的值,那就使用copy。当然这是在源对象为可变的情况下。

  这些规则在NSArray,NSDictionary上同样适用。

  详细的分析可以参考 http://blog.csdn.net/u010810493/article/details/20708547

原文地址:https://www.cnblogs.com/shadowflyer/p/3655959.html