iOS App的啟動(dòng)過(guò)程

1.iOS系統(tǒng)首先會(huì)加載解析該app的info.plist文件,因?yàn)閕nfo.plist中包含了支持app加載進(jìn)行所需要的眾多key value配置信息。比如app的運(yùn)行條件(required device capabilities),是否全屏,app啟動(dòng)圖信息等。
2.創(chuàng)建沙盒-iOS8以后,每次啟動(dòng)app都會(huì)創(chuàng)建新的沙盒路徑,所以我們存儲(chǔ)文件時(shí)要用相對(duì)路徑,否則重新啟動(dòng)app后沙盒路徑發(fā)生變化,會(huì)讀取不到數(shù)據(jù)。
3.根據(jù)info.plist的配置檢查相應(yīng)權(quán)限狀態(tài)
4.加載MachO文件讀取dyld路徑,并運(yùn)行dyld動(dòng)態(tài)連接器(內(nèi)核加載了主程序,dyld只會(huì)負(fù)責(zé)動(dòng)態(tài)庫(kù)的加載)

  • 首先dyld會(huì)尋找合適的cpu運(yùn)行環(huán)境
  • 然后加載程序運(yùn)行所需的依賴庫(kù)和我們自己寫(xiě)的.h .m文件編譯成的.O可執(zhí)行文件,并對(duì)這些庫(kù)進(jìn)行鏈接
  • 加載所有方法(runtime就是在這個(gè)時(shí)候被初始化并完成OC的內(nèi)存布局)
  • 加載C函數(shù)
  • 加載category的擴(kuò)展(此時(shí)runtime會(huì)對(duì)所有類結(jié)構(gòu)進(jìn)行初始化)
  • 加載C++靜態(tài)函數(shù),加載OC的+load方法
  • 最后dyld返回main函數(shù)地址,main函數(shù)被調(diào)用

由此可延伸出另外兩個(gè)問(wèn)題,可以參看我的其他文章:
MachO文件的結(jié)構(gòu):MachO文件的結(jié)構(gòu)
啟動(dòng)優(yōu)化可以怎么做:iOS App啟動(dòng)優(yōu)化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容