Tagged Pointer

之前研究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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 寫這篇文章源于組內(nèi)同事的一個分享,在分享過程中,我們對 Tagged Pointer 有一些疑問,但是網(wǎng)上又沒有找...
    TIME_for閱讀 1,408評論 0 5
  • 1.weak對象什么時候釋放 2.系統(tǒng)對象的緩存 3.Tagged Pointer對象 __weak NSArra...
    指尖猿閱讀 393評論 0 0
  • 在調(diào)試程序或者反編譯App時,經(jīng)??梢钥吹?quot;NSTaggedPointerString"這個東西例如: 打印: 這...
    Mr_Baymax閱讀 10,627評論 15 48
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,042評論 0 9
  • 算是知道為什么nsstring不能用== 判斷了. 因為 ==判斷的是指針 前言 在2013年9月,蘋果推出了iP...
    超_iOS閱讀 196評論 0 1

友情鏈接更多精彩內(nèi)容