NSString strong copy


第一个打印  strongStr 0x1044ceb18 & 0x1070d5608 & 0x16d7c7cd8  & 0x1044ceb18

第二个打印 strCopy      0x104906b18 & 0x10795a610 & 0x16d38fcd8  & 0x104906b18

第三个打印  isKindOfClass:NSString 1 & isMemberOfClass 0

通过第一个打印  和第二个打印

1.对于不可变的对象NSString 不同的引用都是浅拷贝,指向的仍然是原来的数据对象,只是在原有的引用计数上面加一

2.对于第三个打印,这里面分析起来会比较复杂

简单的说,NSString的实例并不是NSString,只是掌握了对象的管理权

CoreFoundation 和OC通过桥接连接起来,其实这个对象是属于NSCFString 

NSCFString是NSString的私有子类,对应CFString的一个对象在OC中进行工作

作为对象的归属CFString的第一个元素isa指针,就是指向NSCFString

这个主要的设计是OC与CoreFoundation的桥接  




第二部分

strongMStr  0x1c4854f40 & 0x107087218 & 0x104dfeb98 & 0x104dfeb98

CopyMStr 0xa000000007070703 & 0x107087220 & 0x104dfeb98 & 0x16ce97c68

结论  通过这个能够明显知道 在进行可变操作的时候,对于原有字符串都是进行了深拷贝,



strongMStr  0x1c4854f40 & 0x107087218 & 0x104dfeb98 & 0x104dfebf8

对于两次打印的 strongMStr,能够得出可变的字符串进行强引用的时候可以不回发生地址的改变




-----------意外点-----------

这个时候直接报错 NSTaggedPointerString

这种是苹果采用的一种新技术叫做伪指针   

通过这个异样的地址我们能够看出  0xa000000007070703

已经不再是NSMutableString 这个时候是不能使用NSMutableString的方法的,这个是为了提升效率所采用的,在使用方法变化的时候,内存会不断的分配,内存会同样不断的增加,在swift 4.0 对于这方面已经有很好的优化。



总结:这里主要是对于copy和strong对于String的应用做出一定得判断

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容