iOS開發(fā)之runtime(10):從C++看static_init()

logo

本系列博客是本人的源碼閱讀筆記,如果有 iOS 開發(fā)者在看 runtime 的璧疗,歡迎大家多多交流坯辩。為了方便討論,本人新建了一個微信群(iOS技術(shù)討論群)崩侠,想要加入的漆魔,請?zhí)砑颖救宋⑿牛簔hujinhui207407,【加我前請備注:ios 】却音,本人博客http://www.kyson.cn 也在不停的更新中改抡,歡迎一起討論

本文完整版詳見筆者小專欄:https://xiaozhuanlan.com/runtime

背景

在文件objc-runtime-new.m中,給如下代碼打個斷點:

打斷點

可以看到調(diào)用棧中有如下函數(shù):

static_init()

以及

_objc_init()

這是我們很熟悉的兩個方法:_objc_init()是上篇文章中說的系瓢,static_init()方法是在_objc_init()中被調(diào)用的阿纤,其定義如下:

/***********************************************************************
* static_init
* Run C++ static constructor functions.
* libc calls _objc_init() before dyld would call our static constructors, 
* so we have to do it ourselves.
**********************************************************************/
static void static_init()
{
    size_t count;
    Initializer *inits = getLibobjcInitializers(&_mh_dylib_header, &count);
    for (size_t i = 0; i < count; i++) {
        inits[i]();
    }
}

通過其注釋,我們大概知道static_init函數(shù)的作用是運行C++的靜態(tài)構(gòu)造函數(shù)夷陋。其原因在于dyld調(diào)用我們的靜態(tài)構(gòu)造函數(shù)晚于libc調(diào)用_objc_init函數(shù)欠拾。這句話咋一看比較難理解,更讓人難以理解的是骗绕,在斷點錢并不是static_init函數(shù)藐窄,而是一個方法:_GLOBAL__sub_I_objc_runtime_new,筆者進入該斷點看到如下內(nèi)容:


image.png

可以看到爹谭,里面有好多類似于

__cxx_global_var_init

的方法枷邪。
那么,這些方法又是做什么的呢诺凡,這是本文討論的問題东揣。

分析

為了解釋上面的代碼,我們做個實驗腹泌。

在XCode的main.m文件中輸入以下代碼:

class Person{
public:
    Person(){
        printf("Person::Person()");
    }

    ~Person(){
        printf("Person::~Person()");
    }
};

Person kyson;

int main() {
    return 0;
}

執(zhí)行后會打印如下結(jié)果:

Person::Person()Person::~Person()

說明執(zhí)行了Person類的構(gòu)造函數(shù)以及析構(gòu)函數(shù)嘶卧。如果讀者對C++的構(gòu)造函數(shù)以及析構(gòu)函數(shù)還有任何疑問的話,可以大概了解一下C++的語法凉袱。筆者的側(cè)重點在于芥吟,我們只是聲明了:

Person kyson;

為什么會執(zhí)行構(gòu)造函數(shù)以及析構(gòu)函數(shù)呢钟鸵。稍微debug一下蒙袍,我們居然發(fā)現(xiàn)狠怨,Person kyson;
這句代碼居然比main()函數(shù)提前執(zhí)行叼风。這有悖于我們之前了解的只有l(wèi)oad函數(shù)早于main()函數(shù)執(zhí)行的常識取董。那么无宿,main()函數(shù)執(zhí)行之前茵汰,系統(tǒng)究竟執(zhí)行了哪些操作,哪些我們能hook呢孽鸡。帶著這個疑問估盘,我們深入研究一下C++的全局變量。

C++ 全局變量初始化


本文完整版詳見筆者小專欄:https://xiaozhuanlan.com/runtime


實驗

在objc_init()方法中刪掉

    static_init();

這一行攀细,會發(fā)現(xiàn)程序有崩潰慨削,崩潰的調(diào)用棧如下:


崩潰堆棧

看右下角可知张遭,其崩潰在方法pthread_rwlock_wrlock中。而這正是因為我們刪掉static_init()后

rwlock_t runtimeLock;
rwlock_t selLock;
mutex_t cacheUpdateLock;
recursive_mutex_t loadMethodLock;

這四行代碼沒有執(zhí)行引起的(因為對應(yīng)的構(gòu)造函數(shù)不能執(zhí)行)地梨。至此謎題終于解開了菊卷。

結(jié)論

本文從C++的全局變量的角度來研究了static_init()的作用,希望大家有所啟發(fā)宝剖。

參考

深入解構(gòu)iOS系統(tǒng)下的全局對象和初始化函數(shù)

廣告

我的首款個人開發(fā)的APP壁紙寶貝上線了洁闰,歡迎大家下載。

壁紙寶貝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末万细,一起剝皮案震驚了整個濱河市扑眉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赖钞,老刑警劉巖腰素,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仁烹,居然都是意外死亡耸弄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門卓缰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來计呈,“玉大人砰诵,你說我怎么就攤上這事“葡裕” “怎么了茁彭?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扶歪。 經(jīng)常有香客問我理肺,道長,這世上最難降的妖魔是什么善镰? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任妹萨,我火速辦了婚禮,結(jié)果婚禮上炫欺,老公的妹妹穿的比我還像新娘富稻。我一直安慰自己慕淡,他們只是感情好躺屁,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布冤今。 她就那樣靜靜地躺著,像睡著了一般桥状。 火紅的嫁衣襯著肌膚如雪帽揪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天辅斟,我揣著相機與錄音转晰,去河邊找鬼。 笑死士飒,一個胖子當著我的面吹牛挽霉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播变汪,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侠坎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裙盾?” 一聲冷哼從身側(cè)響起实胸,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎番官,沒想到半個月后庐完,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡徘熔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年门躯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酷师。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡讶凉,死狀恐怖染乌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情懂讯,我是刑警寧澤荷憋,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站褐望,受9級特大地震影響勒庄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘫里,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一实蔽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谨读,春花似錦盐须、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阶冈。三九已至闷尿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間女坑,已是汗流浹背填具。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匆骗,地道東北人劳景。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像碉就,于是被迫代替她去往敵國和親盟广。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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