iOS散列表緩存窺探

1.

1

2. 散列表(哈希表)是以空間換時(shí)間.

剛開始為cache_t分配一定的內(nèi)存, 如10, 當(dāng)內(nèi)存不夠用時(shí), 內(nèi)存擴(kuò)大2倍, 依次類推

3. 表格大概如下:

2
  • 左邊是索引, 右邊是 bucket_t 結(jié)構(gòu)體

  • 如上圖所示, bucket_t包括 _keyIMP, _key 就是SEL

4.iOS arm64 散列表存儲(chǔ)原理:

    1. 初始時(shí), 為對(duì)象的cach_t分配一個(gè)空間, 值為NULL
    1. 調(diào)用方法時(shí), 為對(duì)象發(fā)送一個(gè) SEL 消息, 如 @selector(personTest), 將這個(gè)方法緩存
    1. 系統(tǒng)用 SEL_mask 作按位與計(jì)算: @selector(personTest) & _mask , 假設(shè)其值==2,
    1. 檢查索引2 對(duì)應(yīng)的空間是否為NULL , 如果為NULL 就將這個(gè)bucket_t 緩存在索引2對(duì)應(yīng)空間
    1. 如果不為空, 索引減1, 再檢查是否為NULL, 依次類推. 如果索引<0, 則使索引 =_mask - 1, 直至找到索引對(duì)應(yīng)空間為NULL, 再緩存

5. 對(duì)應(yīng)的查找步驟:

    1. 調(diào)用方法時(shí), 為對(duì)象發(fā)送一個(gè) SEL 消息, 如 @selector(personTest)
    1. 系統(tǒng)用SEL_mask 作按位與計(jì)算: @selector(personTest) & _mask , 假設(shè)其值==2,
    1. 得到索引2 的bucket_t , 判斷其中的 SEL 是否與傳過來的 SEL 相同, 如果相同, 這個(gè)_imp就是尋找的方法
    1. 如果不相同, 索引減1, 再比較SEL, 依次類推. 如果索引<0, 則使索引 = _mask - 1, 直至找到_imp

6. 為什么按位&_mask?

按位與 可保證得到的值 <= _mask, 這樣就不會(huì)超出分配的空間.

注: 有的系統(tǒng)是求余 %, 如java, 這樣也能保證 <= _mask

7. 為什么有 -1 的算法, 也是因?yàn)榘次慌c, 因?yàn)椴煌闹?& _mask, 可能結(jié)果相同. 如果已經(jīng)被占了, 就-1:

3

8. 如果空間超出原來的_mask, 則 _mask *= 2.

每一次_mask 擴(kuò)容, 散列表清空, 只留下一個(gè)方法占用, 是導(dǎo)致它擴(kuò)容的方法.

    1. 源碼:
4
    1. 實(shí)例:
5

9.打印散列表:

9.1
9.2
    1. 可看到有的空間為NULL

10. 測(cè)試 & _mask 得到方法:

10.1
打印:
10.2

注: selector 轉(zhuǎn)化成數(shù)字類型才能 & , 所以強(qiáng)轉(zhuǎn)成 long long.

11. 將地址 轉(zhuǎn)化 成方法名:

11
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末服球,一起剝皮案震驚了整個(gè)濱河市锋玲,隨后出現(xiàn)的幾起案子勘畔,更是在濱河造成了極大的恐慌劳较,老刑警劉巖薇搁,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件状勤,死亡現(xiàn)場(chǎng)離奇詭異吴侦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)投慈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門承耿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伪煤,你說我怎么就攤上這事×堇保” “怎么了抱既?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)扁誓。 經(jīng)常有香客問我防泵,道長(zhǎng),這世上最難降的妖魔是什么蝗敢? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任捷泞,我火速辦了婚禮,結(jié)果婚禮上寿谴,老公的妹妹穿的比我還像新娘锁右。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布咏瑟。 她就那樣靜靜地躺著拂到,像睡著了一般。 火紅的嫁衣襯著肌膚如雪码泞。 梳的紋絲不亂的頭發(fā)上兄旬,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音余寥,去河邊找鬼领铐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宋舷,可吹牛的內(nèi)容都是我干的罐孝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肥缔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼莲兢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起续膳,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤改艇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后坟岔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谒兄,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年社付,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了承疲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸥咖,死狀恐怖燕鸽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啼辣,我是刑警寧澤啊研,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站鸥拧,受9級(jí)特大地震影響党远,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜富弦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一沟娱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腕柜,春花似錦济似、人聲如沸矫废。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)磷脯。三九已至,卻和暖如春娩脾,著一層夾襖步出監(jiān)牢的瞬間赵誓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工柿赊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俩功,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓碰声,卻偏偏與公主長(zhǎng)得像诡蜓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胰挑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353