从64bit开始引入
Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储
例如:
没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值。
使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中。(当指针不够存储数据时,才会使用动态分配内存的方式来存储数据。)
例子:
给self.name赋值‘abcdefghijklmn’会crash而赋值‘aa’则不会
原因就是‘abcdefghijklmn’字符串的长度超出,指针不够存储数据,因此走的是对象存储。
赋值走的是set方法,如图setter方法中, 对strong修饰的属性会有一个retain和release的操作。
而多线程中可能这个name属性已经被release了,又在另一个线程调用release,造成坏地址访问,引起crash
而‘aa‘字符串不崩溃的原因,则因为走Tagged Pointer存储数据,不走setter方法
网友评论