浅拷贝:指针拷贝,指针与原指针地址相同,没有创建新的对象。
深拷贝:内容拷贝,创建了新的对象,指针地址与原对象的指针地址不同。
NSString测试代码如下
打印结果如下(后面打印出的两个NSCFConstanaString与NSCFString是打印出系统底层实现时调用方法的类)
设置一个断点来鼠标放到变量上查看结果如下
从上面左图可以看出copyStr1它的真实类型为不可变字符串,右图可以看出copyStr2为真实类型为可变字符串。从打印地址来看只有最后一个地址不同。
结论:对一个NSString字符串进行copy不会产生新对象(浅拷贝),进行mutableCopy会产生新对象(深拷贝)。
NSMutableString测试代码如下:
打印结果如下:
鼠标查看真实类型如下:
从上面左图可以看出copyStr1它的真实类型为不可变字符串,右图可以看出copyStr2为真实类型为可变字符串。从打印地址来看都生成了新对象。
结论:对一个NSMutableString字符串进行copy会产生新对象(深拷贝),进行mutableCopy会产生新对象(深拷贝)。copy产生的新对象为NSString类型,mutableCopy产生的新对象为NSMutableString类型。
最后这里出现了如__NSCFString,__NSCFConstantString,NSTaggedPointerString等一些类型,这是系统底层自动字字符串分配选择的类型。下面是我从网上搜到的一些情况。
NSString抽象工厂:
NSString 是 NSCFString的父类
在于NSString是个class cluster,一个类簇。什么是一个类簇?简单的来说,NSString是个“工厂类”,然后它在外层提供了很多方法接口,但是这些方法的实现是由具体 的内部类来实现的。当使用NSString生成一个对象时,初始化方法会判断哪个“自己内部的类”最适合生成这个对象,然后这个“工厂”就会生成这个具体 的类对象返回给你。这种又外层类提供统一抽象的接口,然后具体实现让隐藏的,具体的内部类来实现,在设计模式中称为“抽象工厂”模式。
Tagged Pointer是一个能够提升性能、节省内存的有趣的技术。在OS X 10.10中,NSString就采用了这项技术。对象在内存中是对齐的,它们的地址总是指针大小的整数倍,通常为16的倍数。对象指针是一个64位的整数,而为了对齐,一些位将永远是零。Tagged Pointer利用了这一现状,它使对象指针中非零位有了特殊的含义。在苹果的64位Objective-C实现中,若对象指针的最低有效位为1(即奇数),则该指针为Tagged Pointer。这种指针不通过解引用isa来获取其所属类,而是通过接下来三位的一个类表的索引。该索引是用来查找所属类是采用Tagged Pointer的哪个类。剩下的60位则留给类来使用。
具体的关于__NSCFString与__NSCFConstantString,网上发现一篇分析实在是写得很好,并测试了引用计数的分析情况,链接如下。
http://www.360doc.com/content/15/0304/17/9200790_452525916.shtml