Tagged Pointer

之前研究Autorelease ,看了sunyxx 那篇博客,当你验证代码的时候,会发现和博客不一样,原因就在于Tagged Pointer技术。

image.png

一、Tagged Pointer介绍
1.从64位开始,iOS引入Tagged Pointer技术,用于优化NSNumber、NSString、NSDate等小对象存储。
2.使用Tagged Pointer后,NSNumber指针中存放着Tag+Data,也就是将数据直接放在指针中。
3.指针不够存储数据时,才会动态创建一个对象
4.objc_msgSend能够正确识别Tagged Pointer对象,比如NSNumber的intValue方法,直接从指针中获取,不需要调用方法。

二、看看代码

        NSNumber *a =  @(1);
        NSNumber *b =  @(12);
        NSNumber *c =  @(313123123);

        NSLog(@"a:%p--b:%p--c:%p",a,b,c);

打印如下:

a:0x127--b:0xc27--c:0x12a9e13327

上面代码不难发现,地址有所不同,并且a,b数值放在了指针指向的地址中

三、看看源码


image.png

objc_msgSend能够正确识别Tagged Pointer对象

#if OBJC_MSB_TAGGED_POINTERS //iphone
#   define _OBJC_TAG_MASK (1UL<<63)
#else
#   define _OBJC_TAG_MASK 1UL
#endif
static inline bool 
_objc_isTaggedPointer(const void * _Nullable ptr) 
{
    return ((uintptr_t)ptr & _OBJC_TAG_MASK) == _OBJC_TAG_MASK;
}

判断该对象是Tagged Pointer:
1.iOS 第 64位 是1
2.Mac 第0位 是1

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容