1. 程式人生 > >IOS —— App啟動原理及程式碼優化

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 越多,啟動越慢

在效能優化方面上更能人為把控的:loadT2時間

load: 是在載入過程中,ViewController中的Load方法是自動執行在main方法前的,如果載入物件及方法過多,啟動也會隨之更慢。

所以可以拆分的業務,儘可能拆分處理!

T2時間:能不做資料處理儘可能不做,將耗時任務交由執行緒處理!

 


 

彙報完畢,我們明天見