APP從點擊icon到首頁顯示這個過程中到底做了哪些事情?有哪些地方可以優(yōu)化的空間?
常見的APP啟動都會執(zhí)行這幾個步驟:
main函數(shù)-->AppDelegate-->key Window-->rootViewController
目前總結(jié)了三個方面:
1. 業(yè)務(wù)層
基于上面的過程,將那些沒必要在上述過程中執(zhí)行的代碼邏輯移除掉,盡量精簡上述過程中無關(guān)的邏輯
2. main函數(shù)之前進行優(yōu)化
那APP在我們熟知的main函數(shù)之前到底做了哪些事情呢?
這得從我們的應(yīng)用二進制文件的加載過程說起,也就是Mach-O文件的加載過程,這里不單獨說這個知識點。
我們知道,Mach-O文件中有LC_COMMAND塊,里面鏈接大量的動態(tài)鏈接庫(包括系統(tǒng)的和我們自己定義的 .dylib,.framework),app啟動過程中,dyld會去加載所有的這些庫到內(nèi)存中,這是一個遞歸的過程,依賴的動態(tài)庫可能還會依賴別的動態(tài)庫,所以dyld會遞歸每個動態(tài)庫,直至所有的依賴庫都被加載完畢。
所以,我們在項目中要盡可能的減少引用我們沒要用到的系統(tǒng)庫以及我們自己的動態(tài)庫,一般我們自己的動態(tài)庫最好不要超過4個,如果實在過多,要對他們進行合并,且我們在編寫相應(yīng)的庫時也要減少不必要的類和方法,從而縮小庫的體積。
3. 二進制文件重排
首先來說幾個概念:
a、我們的APP在被啟動的時候,以前的操作系統(tǒng)會將整個app數(shù)據(jù)一股腦兒的加載進內(nèi)存,這樣是不合理的,這會導(dǎo)致我們的內(nèi)存空間不夠用,所以出現(xiàn)了虛擬內(nèi)存的概念,虛擬內(nèi)存并不是說真正的利用磁盤空間開辟了一個新的空間來載入應(yīng)用數(shù)據(jù),而是指操作系統(tǒng)創(chuàng)建了一張虛擬地址表,應(yīng)用程序中所使用到的變量對應(yīng)的地址都是虛擬地址,該虛擬地址是指向內(nèi)存中的一個真正物理地址,而這張?zhí)摂M地址表就是存放虛擬地址和物理地址對應(yīng)關(guān)系的表
b、同樣的,此時操作系統(tǒng)并沒有將整個app數(shù)據(jù)一起加載進內(nèi)存,而是將我們這個APP數(shù)據(jù)進行分頁,每頁的數(shù)據(jù)大小為16K,只有那些是APP啟動所需要的頁才會被加載進內(nèi)存。
那么問題來了,哪些是APP啟動所需要的呢?首先,上述所說的main函數(shù)到rootViewController過程中所調(diào)用的代碼肯定是被需要,另外還有一個NSObject的 +load 方法和+Initializers方法[只有在接收到消息后才調(diào)用],這兩個方法是在main函數(shù)之前會被調(diào)用的[因此,可以減少不必要的load方法,或是盡量將load方法放到少量的類文件中,不要大量類文件中都有l(wèi)oad方法]
如果main函數(shù)到rootViewController過程中所調(diào)用的代碼被分散到多個頁碼塊中時,app在啟動時就需要加載這所有的代碼所在的頁碼塊(此過程由操作系統(tǒng)的“缺頁異?!币l(fā)),如果這樣的頁碼塊太多是會影響啟動加載速度的,因此,我們需要把這個過程中涉及到的代碼全部都放置于同一個或幾個頁碼塊中
所以:

第二步:

自己編寫一個xxx.order文件,文件中按優(yōu)先順序羅列出優(yōu)先需要加載的方法,然后指定到"Build Settings"的“Order File”選項中,xxx.order文件如下:
-[ViewController init]
-[ViewController viewDidLoad]
_CGRectMake
-[ViewController tto]
... #每行寫錯不要緊,xcode編譯器會忽略掉有錯或app中根本不存在的方法
如何編寫xxx.order文件?
a、TARGETS-->Build Settings-->Write Link Map File,打開為YES:

b、build編譯之后,在程序生成目錄的上上目錄中,找到那個test-LinkMap-normal-x86_64.txt文件:[Intermediates.noindex-->test.build-->Debug-iphonesimulator-->test.build-->test-LinkMap-normal-x86_64.txt]

c、xxx-LinkMap-normal-xxx.txt文件如下:[一個類文件中方法的編排順序就是我們在xcode中編寫時,從上到下的順序,跟我們編寫的順序有關(guān)]
