之前研究Autorelease
,看了sunyxx 那篇博客,当你验证代码的时候,会发现和博客不一样,原因就在于Tagged Pointer
技术。
一、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
网友评论