結(jié)構(gòu)體 isa_t

在本章中,我們從NSObject的定義出發(fā)隘截,了解了OC中類(lèi)和對(duì)象所對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)objc_class和objc_object扎阶。關(guān)于NSObject事富,objc_class和objc_object三者之間的關(guān)系,我們可以用下面的圖來(lái)更清晰的了解:



其實(shí) isa_t 是一個(gè)定義得非常"奇怪"的結(jié)構(gòu)體乘陪,在 ObjC 源代碼中可以看到這樣的定義:

#define?ISA_MASK??????0x00007ffffffffff8ULL

#define?ISA_MAGIC_MASK??0x001f800000000001ULL

#define?ISA_MAGIC_VALUE?0x001d800000000001ULL

#define?RC_ONE???(1ULL<<56)

#define?RC_HALF??(1ULL<<7)

union?isa_t?{

????isa_t()?{?}

????isa_t(uintptr_t?value)?:?bits(value)?{?}

????Class?cls;

????uintptr_t?bits;

????struct?{

????????uintptr_t?indexed???????????:?1;

????????uintptr_t?has_assoc?????????:?1;

????????uintptr_t?has_cxx_dtor??????:?1;

????????uintptr_t?shiftcls??????????:?44;

????????uintptr_t?magic?????????????:?6;

????????uintptr_t?weakly_referenced?:?1;

????????uintptr_t?deallocating??????:?1;

????????uintptr_t?has_sidetable_rc??:?1;

????????uintptr_t?extra_rc??????????:?8;

????};

};

這是在 __x86_64__ 上的實(shí)現(xiàn),對(duì)于 iPhone5s 等架構(gòu)為 __arm64__ 的設(shè)備上雕擂,具體結(jié)構(gòu)體的實(shí)現(xiàn)和位數(shù)可能有些差別啡邑,不過(guò)這些字段都是存在的,可以看這里的arm64 上結(jié)構(gòu)體的實(shí)現(xiàn)井赌。

在本篇文章中, 我們會(huì)以 __x86_64__ 為例進(jìn)行分析谤逼,而不會(huì)對(duì)兩種架構(gòu)下由于不同的內(nèi)存布局方式導(dǎo)致的差異進(jìn)行分析。在我看來(lái)仇穗,這個(gè)細(xì)節(jié)不會(huì)影響對(duì) isa 指針的理解流部,不過(guò)還是要知道的。

筆者對(duì)這個(gè) isa_t 的實(shí)現(xiàn)聲明順序有一些更改纹坐,更方便分析和理解枝冀。


union?isa_t?{

????...

};

isa_t 是一個(gè) union 類(lèi)型的結(jié)構(gòu)體,對(duì) union 不熟悉的讀者可以看這個(gè) stackoverflow 上的回答耘子。也就是說(shuō)其中的 isa_t果漾、cls、 bits 還有結(jié)構(gòu)體共用同一塊地址空間谷誓。而 isa 總共會(huì)占據(jù) 64 位的內(nèi)存空間(決定于其中的結(jié)構(gòu)體)

struct?{

???uintptr_t?indexed???????????:?1;

???uintptr_t?has_assoc?????????:?1;

???uintptr_t?has_cxx_dtor??????:?1;

???uintptr_t?shiftcls??????????:?44;

???uintptr_t?magic?????????????:?6;

???uintptr_t?weakly_referenced?:?1;

???uintptr_t?deallocating??????:?1;

???uintptr_t?has_sidetable_rc??:?1;

???uintptr_t?extra_rc??????????:?8;

};


在 isa_t 中绒障,我們還有一些沒(méi)有介紹的其它 bits,在這個(gè)小結(jié)就簡(jiǎn)單介紹下這些 bits 的作用

has_assoc:對(duì)象含有或者曾經(jīng)含有關(guān)聯(lián)引用捍歪,沒(méi)有關(guān)聯(lián)引用的可以更快地釋放內(nèi)存

weakly_referenced:對(duì)象被指向或者曾經(jīng)指向一個(gè) ARC 的弱變量户辱,沒(méi)有弱引用的對(duì)象可以更快釋放

deallocating:對(duì)象正在釋放內(nèi)存

has_sidetable_rc:對(duì)象的引用計(jì)數(shù)太大了,存不下

extra_rc:對(duì)象的引用計(jì)數(shù)超過(guò) 1糙臼,會(huì)存在這個(gè)這個(gè)里面庐镐,如果引用計(jì)數(shù)為 10,extra_rc 的值就為 9



從 NSObject 的初始化了解 isa

https://blog.csdn.net/fishmai/article/details/71158083

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弓摘,一起剝皮案震驚了整個(gè)濱河市焚鹊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌韧献,老刑警劉巖末患,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锤窑,居然都是意外死亡璧针,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)渊啰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)探橱,“玉大人申屹,你說(shuō)我怎么就攤上這事∷砀啵” “怎么了哗讥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)胞枕。 經(jīng)常有香客問(wèn)我杆煞,道長(zhǎng),這世上最難降的妖魔是什么腐泻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任决乎,我火速辦了婚禮,結(jié)果婚禮上派桩,老公的妹妹穿的比我還像新娘构诚。我一直安慰自己,他們只是感情好铆惑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布范嘱。 她就那樣靜靜地躺著,像睡著了一般员魏。 火紅的嫁衣襯著肌膚如雪彤侍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天逆趋,我揣著相機(jī)與錄音盏阶,去河邊找鬼。 笑死闻书,一個(gè)胖子當(dāng)著我的面吹牛名斟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播魄眉,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼砰盐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坑律?” 一聲冷哼從身側(cè)響起岩梳,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晃择,沒(méi)想到半個(gè)月后冀值,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宫屠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年列疗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浪蹂。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抵栈,死狀恐怖告材,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情古劲,我是刑警寧澤斥赋,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站产艾,受9級(jí)特大地震影響灿渴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胰舆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹬挤。 院中可真熱鬧缚窿,春花似錦、人聲如沸焰扳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吨悍。三九已至扫茅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間育瓜,已是汗流浹背葫隙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躏仇,地道東北人恋脚。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像焰手,于是被迫代替她去往敵國(guó)和親糟描。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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