iOS開發(fā)之 runtime(32) :future named class介紹

logo

本系列博客是本人的源碼閱讀筆記,如果有 iOS 開發(fā)者在看 runtime 的玉掸,歡迎大家多多交流伴挚。

前言

在前面的文章中我們分析過(guò),存儲(chǔ)在 hash map 中數(shù)據(jù)的幾個(gè)類:

  • gdb_objc_realized_classes:已經(jīng)實(shí)現(xiàn)過(guò)的類列表
  • remapped_class_map沦辙,已經(jīng)重映射的類列表

今天我們就講另外一個(gè)和上面兩個(gè)息息相關(guān)的 hash map :future_named_class_map夫植,它存儲(chǔ)了 ”未來(lái)“要實(shí)現(xiàn)的類?這里先賣個(gè)關(guān)子,等筆者先將其分析一下再說(shuō):

創(chuàng)建

static NXMapTable *future_named_class_map = nil;
static NXMapTable *futureNamedClasses()
{
    runtimeLock.assertWriting();
    if (future_named_class_map) return future_named_class_map;
    // future_named_class_map is big enough for CF's classes and a few others
    future_named_class_map =  NXCreateMapTable(NXStrValueMapPrototype, 32);
    return future_named_class_map;
}

以上代碼清晰明了:如果有的話使用详民,沒(méi)有的話則創(chuàng)建延欠。

獲取

OBJC_EXPORT Class objc_getFutureClass(const char *name) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0)
    OBJC_ARC_UNAVAILABLE;

這個(gè)方法需要注意,它是在 runtime.h 中聲明的沈跨,也就是說(shuō)由捎,他其實(shí)是對(duì)外暴露的,可以直接使用饿凛,不過(guò)看其注釋:

/*** Used by CoreFoundation's toll-free bridging.
Return the id of the named class.
@return The id of the named class, or an uninitialized class
structure that will be used for the class when and if it does
get loaded.
@warning Do not call this function yourself.
***/

注意最后一句: 不要主動(dòng)調(diào)用這個(gè)函數(shù)狞玛!

我們來(lái)看一下這個(gè)函數(shù)的實(shí)現(xiàn):

Class objc_getFutureClass(const char *name)
{
    Class cls;
    cls = look_up_class(name, YES, NO);
    if (cls) {
        if (PrintFuture) {
            _objc_inform("FUTURE: found %p already in use for %s", 
                         (void*)cls, name);
        }
        return cls;
    }
    return _objc_allocateFutureClass(name);
}

其中函數(shù) look_up_class 這里先不多做介紹了,里面邏輯較多涧窒,而且不是這個(gè)函數(shù)的重點(diǎn)心肪,重點(diǎn)是最后一句:_objc_allocateFutureClass(name) 它才是從 hash map 中獲取對(duì)應(yīng)值的函數(shù),其實(shí)現(xiàn)如下 :

Class _objc_allocateFutureClass(const char *name)
{
    rwlock_writer_t lock(runtimeLock);
    Class cls;
    NXMapTable *map = futureNamedClasses();
    if ((cls = (Class)NXMapGet(map, name))) {
        // Already have a future class for this name.
        return cls;
    }
    cls = _calloc_class(sizeof(objc_class));
    addFutureNamedClass(name, cls);
    return cls;
}

很容易理解:有的話就通過(guò)方法 NXMapGet 取出來(lái)纠吴,沒(méi)有的話則創(chuàng)建硬鞍。

移除

static Class popFutureNamedClass(const char *name)
{
    runtimeLock.assertWriting();

    Class cls = nil;

    if (future_named_class_map) {
        cls = (Class)NXMapKeyFreeingRemove(future_named_class_map, name);
        if (cls && NXCountMapTable(future_named_class_map) == 0) {
            NXFreeMapTable(future_named_class_map);
            future_named_class_map = nil;
        }
    }

    return cls;
}

這個(gè)方法有點(diǎn)熟悉了,正是上文介紹的 remap 的條件之一戴已。上一篇文章講述的是第一個(gè)條件固该,本文講的是第二個(gè)條件。這兩個(gè)條件無(wú)論哪一個(gè)符合都會(huì)調(diào)用方法:addRemappedClass糖儡,即向 remapped_class_map 中插入數(shù)據(jù)蹬音。這里畫一幅圖加深理解:


maps 之間關(guān)系

以上這張圖已經(jīng)說(shuō)明了之前筆者分析的兩個(gè) map 與本文的 map 之間的關(guān)系。

總結(jié)

future named class 的介紹就到這里了休玩,希望大家有所收獲著淆。其實(shí)筆者看來(lái),不管是上一篇文章的 remapped_class_map 還是本文的 future_named_class_map 里面的數(shù)據(jù)都是空拴疤。remapped_class_map 有數(shù)據(jù)是需要一定條件永部,而 future_named_class_map 有數(shù)據(jù)也是需要先 add 的,所以大家對(duì)于這兩個(gè) map 只需要有個(gè)大概的概念就好呐矾,后面如果真的碰到他們有數(shù)據(jù)苔埋,我們?cè)谠敿?xì)分析。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜒犯,一起剝皮案震驚了整個(gè)濱河市组橄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罚随,老刑警劉巖玉工,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異淘菩,居然都是意外死亡遵班,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狭郑,“玉大人腹暖,你說(shuō)我怎么就攤上這事『踩” “怎么了脏答?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亩鬼。 經(jīng)常有香客問(wèn)我以蕴,道長(zhǎng),這世上最難降的妖魔是什么辛孵? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任丛肮,我火速辦了婚禮,結(jié)果婚禮上魄缚,老公的妹妹穿的比我還像新娘宝与。我一直安慰自己,他們只是感情好冶匹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布习劫。 她就那樣靜靜地躺著,像睡著了一般嚼隘。 火紅的嫁衣襯著肌膚如雪诽里。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天飞蛹,我揣著相機(jī)與錄音谤狡,去河邊找鬼。 笑死卧檐,一個(gè)胖子當(dāng)著我的面吹牛墓懂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播霉囚,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼捕仔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼皇耗!你這毒婦竟也來(lái)了颅湘?” 一聲冷哼從身側(cè)響起谴返,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤切黔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后廷蓉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愕把,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谈为,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年湾揽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓤逼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡库物,死狀恐怖霸旗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戚揭,我是刑警寧澤诱告,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站民晒,受9級(jí)特大地震影響精居,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜潜必,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一靴姿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧磁滚,春花似錦佛吓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至晒他,卻和暖如春吱型,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陨仅。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工津滞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灼伤。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓据沈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饺蔑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锌介,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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