iOS開發(fā)之 runtime(35) :其他的一些 section 講解

logo

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

前言

今天是最后一篇講解 _read_images 的文章了,相信大家已經(jīng)厭煩一直在講 _read_images 這個(gè)方法了僧叉。但畢竟這個(gè)方法確實(shí)很重要奕枝,所以筆者才在這里著墨最多棺榔。今天筆者將最后的幾個(gè)代碼塊貼出來,大家一起看看吧隘道。

詳細(xì)

獲取所有的類引用

if (!noClassesRemapped()) {
    for (EACH_HEADER) {
        Class *classrefs = _getObjc2ClassRefs(hi, &count);
        for (i = 0; i < count; i++) {
//這里筆者打印出了相關(guān)信息
            printf("ClassRefs:%s",classrefs[i]->mangledName());
            fflush(stdout);
            remapClassRef(&classrefs[i]);
        }
        // fixme why doesn't test future1 catch the absence of this?
        classrefs = _getObjc2SuperRefs(hi, &count);
        for (i = 0; i < count; i++) {
            remapClassRef(&classrefs[i]);
        }
    }
}

獲取所有的方法引用

static size_t UnfixedSelectors;
for (EACH_HEADER) {
    if (hi->isPreoptimized()) continue;
    //        printf("name:%s\n",hi->fname());
    //        fflush(stdout);
    bool isBundle = hi->isBundle();
    SEL *sels = _getObjc2SelectorRefs(hi, &count);
    UnfixedSelectors += count;
    for (i = 0; i < count; i++) {
        const char *name = sel_cname(sels[i]);
        //            printf("name:%s\n",name);
        //            fflush(stdout);
        sels[i] = sel_registerNameNoLock(name, isBundle);
    }
}

獲取所有的協(xié)議列表

for (EACH_HEADER) {
//以下兩行是筆者加的調(diào)試信息
    printf("class name:%s\n",hi->fname());
    fflush(stdout);
    extern objc_class OBJC_CLASS_$_Protocol;
    Class cls = (Class)&OBJC_CLASS_$_Protocol;
    assert(cls);
    NXMapTable *protocol_map = protocols();
    bool isPreoptimized = hi->isPreoptimized();
    bool isBundle = hi->isBundle();
    
    protocol_t **protolist = _getObjc2ProtocolList(hi, &count);
    for (i = 0; i < count; i++) {
//以下兩行是筆者加的調(diào)試信息
        printf("protocol :%s\n",protolist[i]->nameForLogging());
        fflush(stdout);
        readProtocol(protolist[i], cls, protocol_map,
                     isPreoptimized, isBundle);
    }
}

這個(gè)代碼段筆者要稍微說一下症歇,因?yàn)檫@個(gè)變量名可能大家有點(diǎn)不能理解:

OBJC_CLASS_$_Protocol

全局搜索郎笆,我們發(fā)現(xiàn),其實(shí)是定義在 匯編文件

objc-sel-table.s

中的忘晤。筆者將打印出來的信息放到筆者的 GitHub 中了宛蚓。供大家查閱,地址在這里:
protocollist.txt
大家可能留意到文件最后有個(gè) KysonHere 協(xié)議设塔,其實(shí)是筆者自己加的凄吏,這里筆者將自己寫的測(cè)試類,以及協(xié)議代碼貼出來:

@protocol KysonHere <NSObject>
@optional
-(void) kysonIsHer;
@end

也算是筆者的一段測(cè)試代碼了闰蛔。

獲取所有的協(xié)議引用列表

for (EACH_HEADER) {
    protocol_t **protolist = _getObjc2ProtocolRefs(hi, &count);
    for (i = 0; i < count; i++) {
        //以下兩行為筆者的測(cè)試代碼
        printf("ref protocol :%s\n",protolist[i]->nameForLogging());
        fflush(stdout);
        remapProtocolRef(&protolist[i]);
    }
}

返回的是空痕钢。

獲取所有的分類列表

// Discover categories.
for (EACH_HEADER) {
    category_t **catlist = _getObjc2CategoryList(hi, &count);
    bool hasClassProperties = hi->info()->hasCategoryClassProperties();
    
    for (i = 0; i < count; i++) {
        category_t *cat = catlist[i];
        Class cls = remapClass(cat->cls);
        
        if (!cls) {
            catlist[i] = nil;
            continue;
        }
        
        bool classExists = NO;
        if (cat->instanceMethods ||  cat->protocols
            ||  cat->instanceProperties)
        {
            addUnattachedCategoryForClass(cat, cls, hi);
            if (cls->isRealized()) {
                remethodizeClass(cls);
                classExists = YES;
            }
        }
        
        if (cat->classMethods  ||  cat->protocols
            ||  (hasClassProperties && cat->_classProperties))
        {
            addUnattachedCategoryForClass(cat, cls->ISA(), hi);
            if (cls->ISA()->isRealized()) {
                remethodizeClass(cls->ISA());
            }
        }
    }
}

總結(jié)

_read_images 方法終于告一段落了,希望大家有所收獲序六!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末任连,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子例诀,更是在濱河造成了極大的恐慌随抠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件繁涂,死亡現(xiàn)場(chǎng)離奇詭異拱她,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扔罪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門椭懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人步势,你說我怎么就攤上這事氧猬。” “怎么了坏瘩?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵盅抚,是天一觀的道長。 經(jīng)常有香客問我倔矾,道長妄均,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任哪自,我火速辦了婚禮丰包,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壤巷。我一直安慰自己邑彪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布胧华。 她就那樣靜靜地躺著寄症,像睡著了一般宙彪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上有巧,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天释漆,我揣著相機(jī)與錄音,去河邊找鬼篮迎。 笑死男图,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甜橱。 我是一名探鬼主播享言,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼渗鬼!你這毒婦竟也來了览露?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤譬胎,失蹤者是張志新(化名)和其女友劉穎差牛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堰乔,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偏化,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镐侯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侦讨。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苟翻,靈堂內(nèi)的尸體忽然破棺而出韵卤,到底是詐尸還是另有隱情,我是刑警寧澤崇猫,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布沈条,位于F島的核電站,受9級(jí)特大地震影響诅炉,放射性物質(zhì)發(fā)生泄漏蜡歹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一涕烧、第九天 我趴在偏房一處隱蔽的房頂上張望月而。 院中可真熱鬧,春花似錦议纯、人聲如沸父款。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铛漓。三九已至溯香,卻和暖如春鲫构,著一層夾襖步出監(jiān)牢的瞬間浓恶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工结笨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留包晰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓炕吸,卻偏偏與公主長得像伐憾,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赫模,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353