第一个打印 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的应用做出一定得判断
网友评论