App 總啓動時間
) = t1(main 調用以前的加載時間
) + t2(main 調用以後的加載時間
)系統 dylib(動態連接庫)
和自身 App 可執行文件的加載
main
方法執行以後到AppDelegate
類中的application:didFinishLaunchingWithOptions:
方法執行結束前這段時間,主要是構建第一個界面,並完成渲染展現1. 在**t1**
階段加快**App**
啓動的建議:markdown
dylib
動態庫合併成一個optional linking
,若是App
用到的系統庫在你全部支持的系統版本上都有,就設置爲required
,由於optional
會有些額外的檢查Objective-C Class、Selector、Category
的數量,能夠合併或者刪減一些OC
類+load
中作的事情儘可能挪到+initialize
中,+initialize
是在第一次初始化這個類以前被調用,+load
在加載類的時候就被調用。儘可能將+load
裏的代碼延後調用C++
虛函數,建立虛函數表有開銷__attribute__((constructor))
將方法顯式標記爲初始化器,而是讓初始化方法調用時才執行。好比使用dispatch_once(),pthread_once()或 std::once()
dlopen(),dlopen()
有性能和死鎖的可能性2. 在**t2**
階段加快**App**
啓動的建議:網絡
xib/storyboard
,而是用純代碼做爲首頁UI
,若是要用xib/storyboard
,不要在xib/storyboard
中存放太多的視圖application:didFinishLaunchingWithOptions:
裏的任務儘可能延遲加載或懶加載NSUserDefaults
中存放太多的數據,NSUserDefaults
是一個plist
文件,plist
文件會被反序列化一次log
,少用NSLog
,由於每一次NSLog
的調用都會建立一個新的NSCalendar
實例GCD
建立過多的線程,解決方法是建立串行隊列,或者使用帶有最大併發數限制的NSOperationQueue
磁盤、網絡、Lock或者dispatch_sync、發送消息給其餘線程
等操做