介绍:
TaggedPointer专门用来存储小的对象,如NSNumber、NSDate、NSString。其存储的不是地址,而是真正的值,所以它直接存储到栈中。
引入:
对于指针类型,其长度足够存储一些短小的值,而不必操作堆分配与管理内存。对于大的值,即超过指针类型长度的,则还是在堆中分配内存。所以对于小的值指针内容就包含值,而大的值才是堆内存地址。
存储内容:值+标记
面试题
执行以下两段代码,有什么区别?
1 | dispatch_queue_t queue = dispatch_get_global_queue(0, 0); |
会崩溃,因为该name
为__NSCFString
类型,存储在堆上,是个常规对象,需要维护引用计数。通过setter赋值,异步并发调用会有多条线程执行[_name release]
,连续release
两次就会造成对象的过度释放。
1 | dispatch_queue_t queue = dispatch_get_global_queue(0, 0); |
正常,该name
为NSTaggedPointerString
类型,在objc_release
函数中会判断指针是不是TaggedPointer
类型,是的话就不对对象进行release
操作,也就避免了过度释放对象。