iOS開發(fā)之 runtime(31) :關(guān)于 weak-linked class

logo

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

前言

上一篇文章我們說到添加 remap class 的兩個前提條件是 missingWeakSuperclass 或者 popFutureNamedClass 存在。今天我們詳細(xì)分析一下蝶溶,什么是 missingWeakSuperclass嗜历。

分析

missingWeakSuperclass 的源碼為:

/***********************************************************************
* missingWeakSuperclass
* Return YES if some superclass of cls was weak-linked and is missing.
**********************************************************************/
static bool  missingWeakSuperclass(Class cls) {
    assert(!cls->isRealized());

    if (!cls->superclass) {
        // superclass nil. This is normal for root classes only.
        return (!(cls->data()->flags & RO_ROOT));
    } else {
        // superclass not nil. Check if a higher superclass is missing.
        Class supercls = remapClass(cls->superclass);
        assert(cls != cls->superclass);
        assert(cls != supercls);
        if (!supercls) return YES;
        if (supercls->isRealized()) return NO;
        return missingWeakSuperclass(supercls);
    }
}

代碼的注釋已經(jīng)一目了然:該函數(shù)就是判斷某個 class 的父類是否是 weak-linked 并且缺失了。那 什么叫做 weak-linked抖所?比如 NSObject 是否是 weak-linbked 梨州?很顯然不是的。那么什么是 weak-linked田轧?

weak-linked
我們開發(fā)的時候暴匠,都會使用最新的SDK,但是為了讓老的設(shè)備可以下載并運(yùn)行我們的應(yīng)用傻粘,就要將Deployment Target設(shè)置成之前系統(tǒng)的版本號每窖。例如我們應(yīng)用使用iOS 8.1的SDK,Deployment Target設(shè)置成iOS 5.1.1弦悉,雖然我們開發(fā)的時候使用的是8.1的SDK窒典,但是程序運(yùn)行在的設(shè)備中卻可能是6.0 or 7.0的SDK上,按照蘋果的說法稽莉,如果我們應(yīng)用使用了最新SDK引入的特性瀑志,比如符號、函數(shù)等肩祥,那么在版本較舊的設(shè)備上就運(yùn)行不了后室。下面是蘋果官方文檔的一段話:
Normally, if an application uses a new feature in a framework, it is unable to run on earlier versions of the framework that do not support that feature. Such applications would either fail to launch or crash when an attempt to use the feature was made.
那么為什么我們使用最新的SDK開發(fā)的應(yīng)用卻可以運(yùn)行在舊的系統(tǒng)中呢?答案是使用了弱引用混狠。資料里面說過岸霹,我們自己創(chuàng)建的framework,如果需要做版本兼容将饺,那么就要對今后加入的符號等使用弱引用贡避,使用了弱引用之后,即使在版本較舊的環(huán)境下跑予弧,也可以運(yùn)行刮吧,只是相應(yīng)的符號是NULL,下面就是教我們怎樣定義弱引用掖蛤。有一點(diǎn)需要說明的是杀捻,如果一個framework沒有為新加入的符號加入弱引用,那也不必?fù)?dān)心蚓庭,我們只要在鏈接時弱引用整個framework就好致讥,方法就是鏈接的時候使用 -weak_framework frameworkName

// weak link the function
extern int MyFunction() __attribute__((weak_import));
// weak link the variable
extern int MyVariable __attribute__((weak_import));

這么一來仅仆, missingWeakSuperclass 的作用的作用就不言而喻了:查看 cls 類的祖宗類中是否有類是 weak-linked 的,并且已經(jīng) missing垢袱,祖宗類里有 missing weak-linked 的墓拜,則 cls 的所有信息也是不可信的,所以將其添加到重映射表里请契,映射為nil咳榜,即 cls -> nil。

總結(jié)

本文講解了 weak-linked class 的概念以及 missingWeakSuperclass 的作用爽锥,希望對大家有所幫助涌韩。

參考

Weakly linked symbols and frameworks(弱引用符號和framework)

Frameworks and Weak Linking

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市氯夷,隨后出現(xiàn)的幾起案子贸辈,更是在濱河造成了極大的恐慌,老刑警劉巖肠槽,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奢啥,居然都是意外死亡秸仙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門桩盲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寂纪,“玉大人,你說我怎么就攤上這事赌结±痰埃” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵柬姚,是天一觀的道長拟杉。 經(jīng)常有香客問我,道長量承,這世上最難降的妖魔是什么搬设? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮撕捍,結(jié)果婚禮上拿穴,老公的妹妹穿的比我還像新娘。我一直安慰自己忧风,他們只是感情好默色,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狮腿,像睡著了一般腿宰。 火紅的嫁衣襯著肌膚如雪呕诉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天酗失,我揣著相機(jī)與錄音义钉,去河邊找鬼。 笑死规肴,一個胖子當(dāng)著我的面吹牛捶闸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拖刃,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼删壮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兑牡?” 一聲冷哼從身側(cè)響起央碟,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎均函,沒想到半個月后亿虽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苞也,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年洛勉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片如迟。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡收毫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殷勘,到底是詐尸還是另有隱情此再,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布玲销,位于F島的核電站输拇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痒玩。R本人自食惡果不足惜淳附,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蠢古。 院中可真熱鬧奴曙,春花似錦、人聲如沸草讶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坤溃,卻和暖如春拍霜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薪介。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工祠饺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汁政。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓道偷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親记劈。 傳聞我的和親對象是個殘疾皇子勺鸦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354