isa在對象中的作用

isa是什么

isa 是存在對象中類型是isa_t的聯(lián)合體

//去掉了一些多余的代碼
union isa_t {
    Class cls;
    uintptr_t bits;
    struct {
        uintptr_t nonpointer        : 1;  
        uintptr_t has_assoc         : 1;                                       \
        uintptr_t has_cxx_dtor      : 1;                                       \
        uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
        uintptr_t magic             : 6;                                       \
        uintptr_t weakly_referenced : 1;                                       \
        uintptr_t deallocating      : 1;                                       \
        uintptr_t has_sidetable_rc  : 1;                                       \
        uintptr_t extra_rc          : 19
    };
};
nonpointer

nonpointer代表是否是純指針

  • 0 代表純指針
  • 1 代表不止是類對象地址,isa 中包含了類信息棺牧、對象的引用計數(shù)等
has_assoc

關(guān)聯(lián)對象標(biāo)志位

has_cxx_dtor

該對象是否有 C++ 或者 Objc 的析構(gòu)器,如果有析構(gòu)函數(shù),則需要做析構(gòu)邏輯, 如果沒有,則可以更快的釋放對象

shiftcls

存儲類指針的值横腿。開啟指針優(yōu)化的情況下吠冤,在 arm64 架構(gòu)中有 33 位用來存儲類指針

magic

用于調(diào)試器判斷當(dāng)前對象是真的對象還是沒有初始化的空間

weakly_referenced

存儲對象是否被指向或者曾經(jīng)指向一個 ARC 的弱變量败许,
沒有弱引用的對象可以更快釋放。

deallocating

標(biāo)志對象是否正在釋放內(nèi)存

has_sidetable_rc

當(dāng)對象引用技術(shù)大于 10 時,則需要借用該變量存儲進(jìn)位

extra_rc

當(dāng)表示該對象的引用計數(shù)值,實(shí)際上是引用計數(shù)值減 1针肥, 例如饼记,如果對象的引用計數(shù)為 10,那么 extra_rc 為 9慰枕。如果引用計數(shù)大于 10具则, 則需要使用到下面的 has_sidetable_rc

isa 初始化

核心代碼

objc_object::initIsa(Class cls, bool nonpointer, bool hasCxxDtor) 
{ 
    if (!nonpointer) {
        //如果是純指針,直接設(shè)置到cls
        isa.cls = cls;
    } else {
        isa_t newisa(0);

        //arm64 #   define ISA_MAGIC_VALUE 0x000001a000000001ULL
        //ISA_MAGIC_VALUE  0b0000000000000000000000011010000000000000000000000000000000000001
        /* 
            ISA_MAGIC_VALUE 相當(dāng)于 
            newisa.nonpointer = 0b1;
            newisa.magic = 0b011010;
        */
        newisa.bits = ISA_MAGIC_VALUE;  //標(biāo)記空間被初始化
        // isa.magic is part of ISA_MAGIC_VALUE
        // isa.nonpointer is part of ISA_MAGIC_VALUE

        //has_cxx_dtor 標(biāo)記是否存在c++ 析構(gòu)函數(shù)
        newisa.has_cxx_dtor = hasCxxDtor;

        //shiftcls 保存指針的有效信息
        /*
        這里為什么要 >>3 ?
        主要原因是用于指針中無用的后三位清除減小內(nèi)存的消耗
        指針要按照 8字節(jié)對齊具帮,其指針后三位是沒有意義的0
        所有指針地址結(jié)尾都是 8 或者 0 ( 如 0x0000000100b350f0)
        */
        newisa.shiftcls = (uintptr_t)cls >> 3;

        isa = newisa;
    }
}

isa 和 superclass 的指向圖

isa流程圖.png

驗(yàn)證這幅圖的正確性

運(yùn)行環(huán)境 x86_64

1. 先檢查實(shí)例對象內(nèi)存
// 檢查 object 對象內(nèi)存博肋,并格式化打印 4個內(nèi)存空間
(lldb) x/4gx object
0x101120ba0: 0x001d800100001131 0x0000000000000000
0x101120bb0: 0x0000000000000002 0x00007fff9e64e898

// 冒號左邊的表示地址,右邊的表示內(nèi)容
(lldb) po 0x101120ba0
<LGPerson: 0x101120ba0>

// 第一個存儲的內(nèi)容 0x001d800100001131 就是isa
// 通過 & ISA_MASK 運(yùn)算可以得到父類對象地址
// 當(dāng)前環(huán)境下 ISA_MASK
//#   define ISA_MASK        0x00007ffffffffff8ULL
(lldb) p/x 0x001d800100001131 & 0x00007ffffffffff8ULL
(unsigned long long) $25 = 0x0000000100001130
(lldb) po 0x0000000100001130
LGPerson

2. 檢查類對象內(nèi)存
//上一步操作 得到 0x0000000100001130 就是類對象地址
// 檢查父類對象內(nèi)存
(lldb) x/4gx 0x0000000100001130
0x100001130: 0x001d800100001109 0x0000000100b35140
0x100001140: 0x0000000100f6df70 0x0000000400000007

//結(jié)構(gòu)和實(shí)例對象一致
//第一個就是isa ,這里的isa指向的是元類對象
(lldb) p/x 0x001d800100001109 & 0x00007ffffffffff8ULL
(unsigned long long) $31 = 0x0000000100001108
(lldb) po 0x0000000100001108
LGPerson

//第二個是 superclass (從這里看到了繼承關(guān)系)蜂厅,實(shí)例對象第二個空間是空的
//當(dāng)前類是繼承與 NSObject的匪凡,就到了途中的 Root Class
//只有isa 經(jīng)過了 & ISA_MASK處理,superclass 存儲的就是純指針
(lldb) po 0x0000000100b35140
NSObject

3. 檢查元類對象內(nèi)存
//上一步操作 得到 0x0000000100001108 就是元類對象地址
// 檢查元類對象內(nèi)存
(lldb) x/4gx 0x0000000100001108
0x100001108: 0x001d800100b350f1 0x0000000100b350f0
0x100001118: 0x000000010122d320 0x0000000300000007

//結(jié)構(gòu)與類對象一致
//第一個就是isa ,這里的isa指向的是元類對象
(lldb) p/x 0x001d800100b350f1 & 0x00007ffffffffff8ULL
(unsigned long long) $34 = 0x0000000100b350f0
(lldb) po 0x0000000100b350f0
NSObject

//第二個是 superclass
//元類的繼承與類是差不多的掘猿,繼承自根元類(Meta Root Class)
(lldb) po 0x0000000100b350f0
NSObject

4. 檢查根元類對象內(nèi)存
//上一步操作 得到 0x0000000100b350f0 就是根元類對象地址
// 檢查根元類對象內(nèi)存
(lldb) x/4gx 0x0000000100b350f0
0x100b350f0: 0x001d800100b350f1 0x0000000100b35140
0x100b35100: 0x0000000100f6e320 0x0000000400000007

//第一個就是isa ,這里的isa指向的自己 
(lldb) p/x 0x001d800100b350f1 & 0x00007ffffffffff8ULL
(unsigned long long) $38 = 0x0000000100b350f0
(lldb) po 0x0000000100b350f0
NSObject

//第二個是 superclass
//根據(jù)之前檢查 0x0000000100b35140 是NSObject (基類)
//根元類 的superclas指向了基類,也就是繼承自基類
(lldb) po 0x0000000100b35140
NSObject

//至此isa 以及superclass 锹雏,以及完成了閉環(huán)。
//圖上的指向驗(yàn)證完成
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末术奖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轻绞,更是在濱河造成了極大的恐慌采记,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件政勃,死亡現(xiàn)場離奇詭異唧龄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奸远,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門既棺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人懒叛,你說我怎么就攤上這事丸冕。” “怎么了薛窥?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵胖烛,是天一觀的道長。 經(jīng)常有香客問我诅迷,道長佩番,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任罢杉,我火速辦了婚禮趟畏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滩租。我一直安慰自己赋秀,他們只是感情好利朵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沃琅,像睡著了一般哗咆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上益眉,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天晌柬,我揣著相機(jī)與錄音,去河邊找鬼郭脂。 笑死年碘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的展鸡。 我是一名探鬼主播屿衅,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莹弊!你這毒婦竟也來了涤久?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忍弛,失蹤者是張志新(化名)和其女友劉穎响迂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體细疚,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔗彤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疯兼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片然遏。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吧彪,靈堂內(nèi)的尸體忽然破棺而出待侵,到底是詐尸還是另有隱情,我是刑警寧澤姨裸,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布诫给,位于F島的核電站,受9級特大地震影響啦扬,放射性物質(zhì)發(fā)生泄漏中狂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一扑毡、第九天 我趴在偏房一處隱蔽的房頂上張望胃榕。 院中可真熱鬧,春花似錦、人聲如沸勋又。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楔壤。三九已至鹤啡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹲嚣,已是汗流浹背递瑰。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隙畜,地道東北人抖部。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像议惰,于是被迫代替她去往敵國和親慎颗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容