IOS —— App啟動原理及程式碼優化
哈嘍,好久不見。最近處於心情低迷期就沒怎麼來更新文章了。
在下也算是個半路出家的程式碼家,從之前的文章更新到現在
依然是還是從基礎學起,萬物歸基礎!
所以從今天起每天回來更新彙報學習成果!!每天
今天主要接觸的是Application相關的知識,包括App啟動原理,以及windos視窗控制以及Appdelegate的模組優化等~
1.App啟動原理
在我們建立專案時,有個不起眼的main.m檔案,裡頭只有一個方法,返回的也只有一個int物件。在我剛接觸IOS學識時,這一個不起眼的檔案經常給我分類放在了一個資料夾裡。
具體有什麼用並沒有深究,但是我只知道的是沒回報錯都是從main檔案裡傳出來的。
那麼main.m檔案到底蘊含著什麼東西呢?
int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc , argv , nil , NSStringFromClass([Appdelegate clasee])); } }
Main檔案中返回了一個UIApplicationMain物件,UIApplicationMain可厲害了
他幹了這麼幾件事情
1.建立了 UIApplication 應用物件
2.建立了Application delegate(AppDelegate) 物件
3.建立了一個Event Loop (建立了Runloop物件並且開啟事件迴圈)
4.讀取info.plist檔案
5.基於以上物件(UIApplication、AppDelegate、Runloop)建立一個windos
並且他本身就是一個死迴圈。為什麼呢?
這得從事件迴圈,也就是Runloop物件說起。
蘋果的系統誇張的說,就是對Event loop的實現所建立的
當應用啟動時 - >開啟一個死迴圈Runloop
當頁面靜止時 -> Runloop處於wait狀態。
當觸發事件時 ->判斷事件來源(handle_msg),
根據來源處理觸發事件
1.定時器
2.GCD
3.Source1
處理結束後,繼續進入等待狀態或者應用結束退出迴圈。
簡要地說就是這麼一個周而復始的過程(具體可以看第一篇關於RunLoop的白話文)
這裡可能有人會做一個小小的質疑,你說死迴圈就死迴圈?怎麼證明給我們看?
也可以
int main(int argc, char * argv[]) { @autoreleasepool { int back = UIApplicationMain(argc , argv , nil , NSStringFromClass([Appdelegate clasee])); NSLog(@"back == %d",back); return back; } }
這裡將UIApplicationMain拆分成int物件並且列印他。
因為他是死迴圈的緣故所以NSLog並不會打印出來(不信你可以試一下)。
講了那麼多關於ApplicationMain的東西,到底和程式碼優化有什麼關係呢?
在說優化之前,還得講到的一個特殊的東西,UIWindos
眾所周知,在IOS的APP中windos通常只有一個,是一種特殊的UIView。
UIWindos有屬於自身的層級物件UIWindosLevel,UIWindosLevel的屬性有三,對應關係如下
UIWindosLevelAlert > UIWindosLevelStatusBar > UIWindosLevelNormal
雖然話說Windos通常只有一個,但是並不是不可建立的,以上的屬性就是對於建立多個windos時,可用於控制層級顯示。
windos的作用呢,就是載入檢視,就類似app中裡面的電視機。少了他App什麼都不是。
那麼Windos怎麼建立呢?
{
mac 給程式碼
}
刪除呢?
{
mac給程式碼
}
這裡我們可以根據程式碼分析得知,我們是可以建立application的子類,來進行許多業務的處理。
上述例子我們運用application的子類GgApplication建立了一個廣告頁,並在三秒銷燬了。在主執行緒的application didFinishLaunchingWithOptions~方法中
只用了一行程式碼就解決了,一般來說在Application裡,因為Delegate的方法是啟動的一部分,所以程式碼過於擁擠的話是會影響可視性以及啟動的速度的。
所以在可拆分的情況下,業務儘可能的多的拆分到子類中處理時有助於提高效能的!
在第一個檢視中,不相關的資料處理,都可以放到執行緒中處理(比較耗時的任務)*(省,市)資料載入
需要注意的是,邏輯必須的清晰。因為APPDelegate是啟動的一部分,稍有差錯是會影響整體運作流暢性的。
如果整體啟動過慢,APP開啟時間 ≥ 5s 時, 蘋果官方甚至會將整個App打回不允許上架。這是需要注意的。
2.程式碼優化
關於啟動時間的優化,這邊給出一小部分公式希望能幫助到讀者。
啟動的時間 = T1 + T2
T1(Main方法執行前) 系統環境佈局時間:建立程序、載入分析可執行檔案(庫載入、堆疊環境配置等)
T2(Main方法執行後):從Main方法執行到第一個介面顯示的時間
其中有以下四點是影響啟動速度的
1.庫載入越多,啟動越慢
2.Objc類越多,啟動越慢
3.靜態物件、全域性物件越多、啟動越慢
4.Objc的 +load 越多,啟動越慢
在效能優化方面上更能人為把控的:load 和T2時間
load: 是在載入過程中,ViewController中的Load方法是自動執行在main方法前的,如果載入物件及方法過多,啟動也會隨之更慢。
所以可以拆分的業務,儘可能拆分處理!
T2時間:能不做資料處理儘可能不做,將耗時任務交由執行緒處理!
彙報完畢,我們明天見