之前研究Autorelease ,看了sunyxx 那篇博客,當你驗證代碼的時候,會發(fā)現(xiàn)和博客不一樣,原因就在于Tagged Pointer技術(shù)。

image.png
一、Tagged Pointer介紹
1.從64位開始,iOS引入Tagged Pointer技術(shù),用于優(yōu)化NSNumber、NSString、NSDate等小對象存儲。
2.使用Tagged Pointer后,NSNumber指針中存放著Tag+Data,也就是將數(shù)據(jù)直接放在指針中。
3.指針不夠存儲數(shù)據(jù)時,才會動態(tài)創(chuàng)建一個對象
4.objc_msgSend能夠正確識別Tagged Pointer對象,比如NSNumber的intValue方法,直接從指針中獲取,不需要調(diào)用方法。
二、看看代碼
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
上面代碼不難發(fā)現(xiàn),地址有所不同,并且a,b數(shù)值放在了指針指向的地址中
。
三、看看源碼

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