iOS Tagged Pointer

从64bit开始引入

Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储

例如:

没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值。

使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中。(当指针不够存储数据时,才会使用动态分配内存的方式来存储数据。)

例子:


iOS Tagged Pointer_第1张图片

给self.name赋值‘abcdefghijklmn’会crash而赋值‘aa’则不会

原因就是‘abcdefghijklmn’字符串的长度超出,指针不够存储数据,因此走的是对象存储。

赋值走的是set方法,如图setter方法中, 对strong修饰的属性会有一个retain和release的操作。

而多线程中可能这个name属性已经被release了,又在另一个线程调用release,造成坏地址访问,引起crash


iOS Tagged Pointer_第2张图片

而‘aa‘字符串不崩溃的原因,则因为走Tagged Pointer存储数据,不走setter方法

你可能感兴趣的:(iOS Tagged Pointer)