NONPointer_isa 指針中存放與該對象內(nèi)存相關(guān)的消息

蘋果將ISA設(shè)計(jì)成了聯(lián)合體,在ISA中存儲了與該對象相關(guān)的一些內(nèi)存信息怎披,因?yàn)?并不需要64個二進(jìn)制全部都用來存儲指針
ISA 的結(jié)構(gòu)

// x86_64 架構(gòu)
struct {
    uintptr_t nonpointer        : 1;  // 0:普通指針盛龄,1:優(yōu)化過饭耳,使用位域存儲更多信息
    uintptr_t has_assoc         : 1;  // 對象是否含有或曾經(jīng)含有關(guān)聯(lián)引用
    uintptr_t has_cxx_dtor      : 1;  // 表示是否有C++析構(gòu)函數(shù)或OC的dealloc
    uintptr_t shiftcls          : 44; // 存放著 Class爱只、Meta-Class 對象的內(nèi)存地址信息
    uintptr_t magic             : 6;  // 用于在調(diào)試時分辨對象是否未完成初始化
    uintptr_t weakly_referenced : 1;  // 是否被弱引用指向
    uintptr_t deallocating      : 1;  // 對象是否正在釋放
    uintptr_t has_sidetable_rc  : 1;  // 是否需要使用 sidetable 來存儲引用計(jì)數(shù)
    uintptr_t extra_rc          : 8;  // 引用計(jì)數(shù)能夠用 8 個二進(jìn)制位存儲時浪规,直接存儲在這里
};

// arm64 架構(gòu)
struct {
    uintptr_t nonpointer        : 1;  // 0:普通指針结蟋,1:優(yōu)化過脯倚,使用位域存儲更多信息
    uintptr_t has_assoc         : 1;  // 對象是否含有或曾經(jīng)含有關(guān)聯(lián)引用
    uintptr_t has_cxx_dtor      : 1;  // 表示是否有C++析構(gòu)函數(shù)或OC的dealloc
    uintptr_t shiftcls          : 33; // 存放著 Class、Meta-Class 對象的內(nèi)存地址信息
    uintptr_t magic             : 6;  // 用于在調(diào)試時分辨對象是否未完成初始化
    uintptr_t weakly_referenced : 1;  // 是否被弱引用指向
    uintptr_t deallocating      : 1;  // 對象是否正在釋放
    uintptr_t has_sidetable_rc  : 1;  // 是否需要使用 sidetable 來存儲引用計(jì)數(shù)
    uintptr_t extra_rc          : 19;  // 引用計(jì)數(shù)能夠用 19 個二進(jìn)制位存儲時嵌屎,直接存儲在這里
};

這里的 has_sidetable_rc 和 extra_rc, has_sidetable_rc 表明了該指針是否引用了sidetable 散列表推正,之所以有這個選項(xiàng),是因?yàn)樯倭康囊糜?jì)數(shù)是不會直接存放在SideTables表中的宝惰,對象的引用計(jì)數(shù)會存放在extra_rc 中植榕,當(dāng)其被存滿時,才會存入相應(yīng)的SideTables 散列表中尼夺,SideTable 中有很多張SideTable尊残,每個SideTable 也都是一個散列表,而引用計(jì)數(shù)表就包含在SideTable之中淤堵。

散列表 (引用計(jì)數(shù)表寝衫,弱引用表)
引用計(jì)數(shù)要么存放在isa 的 extra_rc 中,要么存放在引用計(jì)數(shù)表中拐邪,而引用計(jì)數(shù)表中包含在一個叫SideTable 的結(jié)構(gòu)中慰毅,它是一個散列表,也就是哈希表扎阶。而SideTable又包含在一個全局的StripeMap的哈希映射表中汹胃,這個表的名字叫SideTables婶芭。

當(dāng)一個對象訪問SideTables 時:
1、首先會取得對象的地址统台,將地址進(jìn)行哈希運(yùn)算,與SideTables中的SideTabel的個數(shù)取余啡邑,最后得到的結(jié)果就是該對象所訪問的SideTable
2贱勃、在取的SideTable 中RefcountMap 表中再進(jìn)行一次哈希查找。找到該對象在引用計(jì)數(shù)表中對應(yīng)的位置谤逼。
3贵扰、如果該對象存在對應(yīng)的引用計(jì)數(shù),則對其進(jìn)行操作流部,如果沒有對應(yīng)的引用計(jì)數(shù)戚绕,則創(chuàng)建一個對應(yīng)的size_t對象,其實(shí)就是一個uint類型的無符號整型枝冀。

弱引用表也是一張哈希表的結(jié)構(gòu)舞丛,其內(nèi)部包含了每個對象對應(yīng)的弱引用表weak_entry_t,而weak_entry_t 是一個結(jié)構(gòu)數(shù)組果漾,其中包含的則是每一個對象弱引用的對象對應(yīng)的弱引用指針球切。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绒障,隨后出現(xiàn)的幾起案子吨凑,更是在濱河造成了極大的恐慌,老刑警劉巖户辱,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸵钝,死亡現(xiàn)場離奇詭異,居然都是意外死亡庐镐,警方通過查閱死者的電腦和手機(jī)恩商,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來必逆,“玉大人痕届,你說我怎么就攤上這事∧┗迹” “怎么了研叫?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長璧针。 經(jīng)常有香客問我嚷炉,道長,這世上最難降的妖魔是什么探橱? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任申屹,我火速辦了婚禮绘证,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哗讥。我一直安慰自己嚷那,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布杆煞。 她就那樣靜靜地躺著魏宽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪决乎。 梳的紋絲不亂的頭發(fā)上队询,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音构诚,去河邊找鬼蚌斩。 笑死,一個胖子當(dāng)著我的面吹牛范嘱,可吹牛的內(nèi)容都是我干的送膳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丑蛤,長吁一口氣:“原來是場噩夢啊……” “哼肠缨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盏阶,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晒奕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后名斟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脑慧,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年砰盐,在試婚紗的時候發(fā)現(xiàn)自己被綠了闷袒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡岩梳,死狀恐怖囊骤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冀值,我是刑警寧澤也物,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站列疗,受9級特大地震影響滑蚯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一告材、第九天 我趴在偏房一處隱蔽的房頂上張望坤次。 院中可真熱鬧,春花似錦斥赋、人聲如沸缰猴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滑绒。三九已至,卻和暖如春骚露,著一層夾襖步出監(jiān)牢的瞬間蹬挤,已是汗流浹背缚窿。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工棘幸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倦零。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓误续,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扫茅。 傳聞我的和親對象是個殘疾皇子蹋嵌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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