0%

Objective-C:Tagged Pointer

介绍:

TaggedPointer专门用来存储小的对象,如NSNumber、NSDate、NSString。其存储的不是地址,而是真正的值,所以它直接存储到栈中。

引入:

对于指针类型,其长度足够存储一些短小的值,而不必操作堆分配与管理内存。对于大的值,即超过指针类型长度的,则还是在堆中分配内存。所以对于小的值指针内容就包含值,而大的值才是堆内存地址。

存储内容:值+标记

面试题

执行以下两段代码,有什么区别?

1
2
3
4
5
6
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
for (int i = 0; i < 1000; i++) {
dispatch_async(queue, ^{
self.name = [NSString stringWithFormat:@"abcdefghij"];
});
}

会崩溃,因为该name__NSCFString类型,存储在堆上,是个常规对象,需要维护引用计数。通过setter赋值,异步并发调用会有多条线程执行[_name release],连续release两次就会造成对象的过度释放。

1
2
3
4
5
6
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
for (int i = 0; i < 1000; i++) {
dispatch_async(queue, ^{
self.name = [NSString stringWithFormat:@"abcdefghi"];
});
}

正常,该nameNSTaggedPointerString类型,在objc_release函数中会判断指针是不是TaggedPointer类型,是的话就不对对象进行release操作,也就避免了过度释放对象。

参考

欢迎关注我的其它发布渠道