iOS 啟動(dòng)優(yōu)化【轉(zhuǎn)自iOS開發(fā)高手課】

概念

一般情況下涝滴,App的啟動(dòng)分為冷啟動(dòng)和熱啟動(dòng)

  • 冷啟動(dòng)的含義是App點(diǎn)擊啟動(dòng)之前海雪,它的進(jìn)程不在系統(tǒng)里土匀,需要系統(tǒng)新創(chuàng)建一個(gè)進(jìn)程分配給它啟動(dòng)的情況子房。這是一次完整的啟動(dòng)過程。
  • 熱啟動(dòng)的含義是App在冷啟動(dòng)后將App退到后臺,在App的進(jìn)程還在系統(tǒng)里的情況下证杭,用戶重新啟動(dòng)進(jìn)入App的過程田度,這個(gè)過程所做的事情非常少。
    這里只討論冷啟動(dòng)的啟動(dòng)優(yōu)化

啟動(dòng)時(shí)都干了哪些事

用戶能感覺到的啟動(dòng)慢解愤,其實(shí)都發(fā)生在主線程上镇饺。而主線程慢的原因有很多,比如在主線程上執(zhí)行了大文件讀寫送讲、在渲染周期中執(zhí)行了大量計(jì)算等奸笤。
App的啟動(dòng)時(shí)間,指的是從用戶點(diǎn)擊App開始哼鬓,到用戶看到第一個(gè)界面之間的時(shí)間监右。總結(jié)來說异希,App的啟動(dòng)主要包括三個(gè)階段:

  1. main()函數(shù)執(zhí)行之前
  2. main()函數(shù)執(zhí)行之后
  3. 首屏渲染完成后
main()函數(shù)執(zhí)行之前

在main()函數(shù)執(zhí)行之前健盒,系統(tǒng)主要會做如下幾件事情:

  • 加載可執(zhí)行文件(App的.o文件的集合)
  • 加載動(dòng)態(tài)鏈接庫,進(jìn)行rebase指針調(diào)整和bind符號綁定
  • Objc運(yùn)行時(shí)的初始處理称簿,包括Objc相關(guān)類的注冊扣癣、category注冊、selector唯一性檢查等
  • 初始化憨降,包括了執(zhí)行+load()方法父虑、attribute((constructor))修飾的函數(shù)的調(diào)用、創(chuàng)建c++靜態(tài)全局變量
    相應(yīng)的授药,這個(gè)階段對于啟動(dòng)速度優(yōu)化來說士嚎,可以做的事情包括:
  • 減少動(dòng)態(tài)庫加載。每個(gè)庫本身都有依賴關(guān)系烁焙,Apple建議使用更少的依賴庫航邢,并且建議在使用的動(dòng)態(tài)庫數(shù)量較多時(shí),盡量將多個(gè)動(dòng)態(tài)庫進(jìn)行合并骄蝇。數(shù)量上,蘋果公司建議最多使用6個(gè)非系統(tǒng)動(dòng)態(tài)庫操骡。
  • 減少加載啟動(dòng)后不會去使用的類或方法
  • +load()方法里的內(nèi)容可以等到首屏渲染完成后再執(zhí)行九火,或者使用+initialize()方法替換掉。因?yàn)樵谝粋€(gè)+void()方法里册招,進(jìn)行運(yùn)行時(shí)方法替換操作會帶來4毫秒的消耗岔激。不要小看這4毫秒,積少成多是掰,執(zhí)行+load()方法對啟動(dòng)速度的影響會越來越大虑鼎。
main()函數(shù)執(zhí)行之后

main()函數(shù)執(zhí)行后的階段,指的是從main()函數(shù)執(zhí)行開始,到AppDelegate的didFinishLaunchingWithOptions方法里首屏渲染相關(guān)方法執(zhí)行完成炫彩。
首頁的業(yè)務(wù)代碼都是要在這個(gè)階段匾七,也就是首屏渲染前執(zhí)行的,主要包括了:

  • 首屏初始化所需配置文件的讀寫操作
  • 首屏列表大數(shù)據(jù)的讀取
  • 首屏渲染的大量計(jì)算等
    很多時(shí)候江兢,開發(fā)者會把各種初始化工作都放到這個(gè)階段執(zhí)行昨忆,導(dǎo)致渲染完成滯后。更加優(yōu)化的開發(fā)方式杉允,應(yīng)該是從功能上梳理出哪些事首屏渲染必要的初始化功能邑贴,哪些事App啟動(dòng)必要的初始化功能,而哪些事只需要在對應(yīng)功能開始使用時(shí)才需要初始化的叔磷。梳理完之后拢驾,將這些初始化功能分別到合適的階段去進(jìn)行。
首屏渲染完成后

首屏渲染后的這個(gè)階段改基,主要完成的是非首屏其他業(yè)務(wù)服務(wù)模塊的初始化独旷、監(jiān)聽的注冊、配置文件的讀取等寥裂。從函數(shù)上來看嵌洼,這個(gè)階段指的就是截止到didFinishLaunchingWithOptions方法作用域內(nèi)支線首屏渲染之后所有方法執(zhí)行完成。簡單的說封恰,這個(gè)階段就是從渲染完成后開始麻养,到didFinishLaunchingWithOptions方法作用域完成時(shí)結(jié)束。
這個(gè)階段用戶已經(jīng)能看到App的首頁信息了诺舔,所以優(yōu)化的優(yōu)先級排在最后鳖昌。但是,那些會卡住主線程的方法還是需要最優(yōu)先處理的低飒,不然還是會影響到后面用戶的交互操作许昨。

怎么做

根據(jù)App啟動(dòng)階段需要完成的工作,我們可以從功能級別和方法級別進(jìn)行啟動(dòng)優(yōu)化褥赊。

功能級別的啟動(dòng)優(yōu)化

功能級別的啟動(dòng)優(yōu)化糕档,就是要從main()函數(shù)執(zhí)行后的這個(gè)階段下手。
優(yōu)化的思路是:main()函數(shù)開始執(zhí)行后到首屏渲染完成前只處理首屏相關(guān)的業(yè)務(wù)拌喉,其他非首屏業(yè)務(wù)的初始化速那、監(jiān)聽注冊、配置文件讀取等都放到首屏渲染完成后去做尿背。

方法級別的啟動(dòng)優(yōu)化

經(jīng)過功能級別的啟動(dòng)優(yōu)化端仰,也就是將非首屏業(yè)務(wù)所需的功能滯后以后,從用戶點(diǎn)擊App到看到首屏的時(shí)間將會有很大程度的縮短田藐,也就達(dá)到了優(yōu)化App啟動(dòng)速度的目的荔烧。
在這之后吱七,我們需要進(jìn)一步做的,是檢查首屏渲染完成前主線程有哪些耗時(shí)方法鹤竭,將沒有必要的耗時(shí)方式滯后或異步執(zhí)行踊餐。通常情況下,耗時(shí)較長的方法主要發(fā)生在計(jì)算大量數(shù)據(jù)的情況下诺擅,具體的表現(xiàn)就是加載市袖、編輯、存儲圖片和文件等資源烁涌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苍碟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子撮执,更是在濱河造成了極大的恐慌微峰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抒钱,死亡現(xiàn)場離奇詭異蜓肆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谋币,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門仗扬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蕾额,你說我怎么就攤上這事早芭。” “怎么了诅蝶?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵退个,是天一觀的道長。 經(jīng)常有香客問我调炬,道長语盈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任缰泡,我火速辦了婚禮刀荒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匀谣。我一直安慰自己照棋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布武翎。 她就那樣靜靜地躺著,像睡著了一般溶锭。 火紅的嫁衣襯著肌膚如雪宝恶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音垫毙,去河邊找鬼霹疫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛综芥,可吹牛的內(nèi)容都是我干的丽蝎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼膀藐,長吁一口氣:“原來是場噩夢啊……” “哼屠阻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起额各,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤国觉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后虾啦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麻诀,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年傲醉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝇闭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硬毕,死狀恐怖呻引,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昭殉,我是刑警寧澤苞七,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挪丢,受9級特大地震影響蹂风,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乾蓬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一惠啄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧任内,春花似錦撵渡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至越除,卻和暖如春节腐,著一層夾襖步出監(jiān)牢的瞬間外盯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工翼雀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饱苟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓狼渊,卻偏偏與公主長得像箱熬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子狈邑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355