iOS APP啟動時所有方法的調(diào)用順序分析

轉(zhuǎn)載自:對應用程序啟動時所有方法的調(diào)用順序分析 - 董鉑然 - 博客園

一個應用程序的啟動過程要包括代理的創(chuàng)建燕垃,控制器的加載和控制器view的加載彻况,這其中有很多關于生命周期的方法,每個方法都是有先后順序的越驻,如果調(diào)用順序拿不準声离,或者某段代碼寫的方法不恰當,就會遇到各種奇葩問題批狐。本文不怕麻煩的在幾乎所有啟動時要調(diào)用的方法里都用了 __FUNCTION__ 打印。結(jié)果還有有些地方出人意料的

首先回顧一下應用程序的啟動過程

①.先加載Main函數(shù)

②.在Main函數(shù)里的 UIApplicationMain方法中前塔,創(chuàng)建Application對象 創(chuàng)建Application的Delegate對象

③.創(chuàng)建主循環(huán)嚣艇,代理對象開始監(jiān)聽事件

④.啟動完畢會調(diào)用 didFinishLaunching方法,并在這個方法中創(chuàng)建UIWindow

⑤.設置UIWindow的根控制器是誰

⑥.如果有storyboard华弓,會根據(jù)info.plist中找到應用程序的入口storyboard并加載箭頭所指的控制器

⑦.顯示窗口

本文考慮的時步驟③之后到步驟⑦結(jié)束時將要調(diào)用的方法

其中有AppDelegate,ViewController,MainView(控制器的View),ChildView(子控件的View)的18個方法

AppDelegate中的:

1.application:didFinishLaunchingWithOptions:

2.applicationDidBecomeActive:

ViewController中的:

3.loadView

4.viewDidLoad

5.load

6.initialize

7.viewWillAppear

8.viewWillLayoutSubviews

9.viewDidLayoutSubviews

10.viewDidAppear

MainView(控制器的View)中的:

11.initWithCoder(如果沒有storyboard就會調(diào)用initWithFrame食零,這里兩種方法視為一種)

12.awakeFromNib

13.layoutSubviews

14.drawRect

ChildView(子控件View)中的:

15.initWithCoder(如果沒有storyboard就會調(diào)用initWithFrame,這里兩種方法視為一種)

16.awakeFromNib

17.layoutSubviews

18.drawRect

那么問題來了寂屏,不往下看你可以把上面的十八個方法排個順序么贰谣?

下面的圖是Xcode6.3的beta2版

有時有變化也就是最后兩個方法有點出入

我更傾向于Xcode 6.1 覺得更科學 下面就是對各個方法的整理

+ (void)load;

1.這是應用程序啟動就會調(diào)用的方法娜搂,在這個方法里寫的代碼最先調(diào)用(董鉑然原創(chuàng))

+ (void)initialize;

2.這個是需要用到本類時才調(diào)用,這個方法里一般寫 設置導航控制器的主題啊 之類的吱抚,如果在后面的方法設置導航欄主題就晚了0儆睢(當然在上面的方法里也能寫)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions;

3.這個方法里面會創(chuàng)建UIWindow,設置根控制器并展現(xiàn)秘豹,比如某些應用程序要加載授權頁面也是在這加携御,也可以設置觀察者,監(jiān)聽到通知切換根控制器

ChildView - (instancetype)initWithCoder:(NSCoder*)aDecoder;

4.這里反正我是萬萬沒想到憋肖,childView的initwithcoder會在MainView的方法之前調(diào)用因痛,父的都還沒出來,就先整子控件岸更? 有了解比較透徹的博友懇請告訴我謝謝鸵膏。

MainView - (instancetype)initWithCoder:(NSCoder*)aDecoder;

5.就是關于應用程序的數(shù)據(jù)存儲后的解檔操作。

MainView - (void)awakeFromNib;

6.在這個方法里設置view的背景等一系列普通操作怎炊,不要寫關于frame的還不準谭企,在使用IB的時候才會涉及到此方法的使用,當.nib文件被加載的時候评肆,會發(fā)送一個awakeFromNib的消息到.nib文件中的每個對象债查,每個對象都可以定義自己的awakeFromNib函數(shù)來響應這個消息,執(zhí)行一些必要的操作瓜挽。

ChildView - (void)awakeFromNib

7.子控件也有本方法盹廷,重寫父類的方法【贸龋基本用法同上

- (void)loadView;

8.創(chuàng)建視圖的層次結(jié)構(gòu)俄占,這里需要注意,在沒有創(chuàng)建控制器的view的情況下不能直接寫 self.view 因為self.view的底層是:

if(_view == nil){

_view = [self loadView]

}

所以這么寫會直接造成死循環(huán)淆衷。

如果重寫這個loadView方法里面什么都不寫缸榄,會顯示黑屏。

如果寫了[super view]還要看前面的控制器在創(chuàng)建時是寫的initWithNibName(指定了xib名字)祝拯,還是寫的普通的init甚带。 如果是后者還是黑屏。

如果不在這個方法中佳头,init的底層是會調(diào)用initWithNibName的鹰贵,如果名字是MainViewController,會先在項目中找MainView.xib 找不到會再找MainViewController.xib康嘉。

- (void)viewDidLoad;

9.臥槽砾莱,這個方法是當年用的最多的方法,但是在之后的開發(fā)中就會發(fā)現(xiàn)越來越不靠譜凄鼻,很多東西都還沒加載完畢腊瑟,各種取值都不準確,很少在這里面寫東西了块蚌。?這里只是把視圖元件加載完成闰非,還沒有開始布局不要設置關于 frame 之類的屬性!有時可能會出現(xiàn)差20個像素點等狀況峭范。

- (void)viewWillAppear:(BOOL)animated;

10.視圖將要出現(xiàn)财松,這個方法用的非常多,比如如果要設置導航欄的setNavigationBarHiden:animate: 就必須要在這里寫纱控,才能完美契合辆毡,不卡跳。 還有很多比如監(jiān)聽屏幕旋轉(zhuǎn)啦甜害,

viewWillTransitionToSize:可能要在本方法里再調(diào)一次舶掖,或者就是新到這個界面要reloadData或是自動下拉刷新等 都是寫在本方法里。

- (void)viewWillLayoutSubviews;

11.視圖將要布局子視圖尔店,蘋果建議的設置界面布局屬性的方法眨攘,這個方法和viewWillAppear里,系統(tǒng)的底層都是沒有寫任何代碼的嚣州,也就是說這里面不寫super 也是可以的

MainView? - (void)layoutSubviews;

12.在這個方法里一般設置子控件的frame鲫售,因為這里相當于是布局基本完成了,設置時取到的frame或者是self.bounds才最準该肴,如果在awakeFromeNib里寫會不準確 情竹。還有這里要切記千萬不能把super layoutSubviews忘了,可能最后都很難找到這個bug

- (void)viewDidLayoutSubviews;

13.這個方法我也是玩玩沒想到匀哄,控制器的view的子控件還沒有布局好呢秦效,怎么這個控制器就已經(jīng)說布局全部完成了?那后邊的布局就不等了拱雏? 有獨到見解的也懇請你告訴我棉安,這其中蘋果的意思到底是什么。

ChildView - (void)layoutSubviews;

14.控制器的子控件里的子控件的布局就在這里寫了铸抑。

MainView - (void)drawRect:(CGRect)rect;

15. 因為默認所有額UI控件都是畫上去的贡耽,在這一步就是把所有的東西畫上去,有時候需要用到Quartz2D的知識的時候都是在這個方法里話鹊汛,但也是要注意別忘了寫super蒲赂,不然系統(tǒng)原本的東西就都畫不上來了,這里要建議盡可能使用貝塞爾路徑畫圖形刁憋,因為系統(tǒng)默認的那個上下文畫法有時可能會內(nèi)存泄露滥嘴。drawRect方法只能在加載時調(diào)用一次,如果后面還需要調(diào)用至耻,比如下載進度的圓弧若皱,需要一直刷幀镊叁,就要使用setNeedsDisplay來定時多次調(diào)用本方法

ChildView - (void)drawRect:(CGRect)rect;

16.view的子控件內(nèi)部的畫圖方法,有時可以自己自定義label 中間帶個刪除線的(用來寫打折前的原價) 就是在這里畫根線 走触。

- (void)viewDidAppear:(BOOL)animated;

17.把上面的畫圖都畫完了晦譬,這里就會顯示,視圖完全加載完成互广。在這里的操作可能就是設置頁面的一些動畫,或者是設置tableView敛腌,collectionView,QQ聊天頁面啥的滾動到底部scrollToIndexPath之類的代碼操作惫皱。

- (void)applicationDidBecomeActive:(UIApplication *)application;

18.最后這是AppDelegate的應用程序獲取焦點方法像樊,真正到了這里,才是所有東西全部加載完畢旅敷,應用程序整裝待發(fā)保持最佳狀態(tài)等待用戶操作生棍。這個方法中一般會寫關于彈出鍵盤的方法,比如有的用戶登錄界面為了更好的用戶體驗扫皱,就讓你在剛打開程序來到登錄界面的時候足绅,光標的焦點就自動在賬號的文本框里閃爍,也就是設置賬號文本框為第一響應者韩脑。鍵盤在頁面加載完畢后從下方彈出氢妈,這種代碼一般就在本方法寫。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末段多,一起剝皮案震驚了整個濱河市首量,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌进苍,老刑警劉巖加缘,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異觉啊,居然都是意外死亡拣宏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門杠人,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勋乾,“玉大人,你說我怎么就攤上這事嗡善〖” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵罩引,是天一觀的道長各吨。 經(jīng)常有香客問我,道長袁铐,這世上最難降的妖魔是什么揭蜒? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任横浑,我火速辦了婚禮,結(jié)果婚禮上忌锯,老公的妹妹穿的比我還像新娘伪嫁。我一直安慰自己,他們只是感情好偶垮,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帝洪,像睡著了一般似舵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葱峡,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天砚哗,我揣著相機與錄音,去河邊找鬼砰奕。 笑死蛛芥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的军援。 我是一名探鬼主播仅淑,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胸哥!你這毒婦竟也來了涯竟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤空厌,失蹤者是張志新(化名)和其女友劉穎庐船,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘲更,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡筐钟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赋朦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篓冲。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖北发,靈堂內(nèi)的尸體忽然破棺而出纹因,到底是詐尸還是另有隱情,我是刑警寧澤琳拨,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布瞭恰,位于F島的核電站,受9級特大地震影響狱庇,放射性物質(zhì)發(fā)生泄漏惊畏。R本人自食惡果不足惜恶耽,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颜启。 院中可真熱鬧偷俭,春花似錦、人聲如沸缰盏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽口猜。三九已至负溪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間济炎,已是汗流浹背川抡。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留须尚,地道東北人崖堤。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像耐床,于是被迫代替她去往敵國和親密幔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,107評論 25 707
  • 時間的速度是難以想象的咙咽,流年暗中偷換老玛,你換了你的,我換了我的钧敞,有時在鏡中看不清的自己蜡豹,在別人的臉上卻看見了。 我們...
    劉鼻涕26閱讀 188評論 0 1
  • 知識,指的是能夠指導我們做出更好決策愚战,且長期來看可能給我們帶來更好結(jié)果的信息娇唯。信息能夠升級成為知識,需要具備兩個條...
    BarryZhang閱讀 564評論 0 0
  • 參考: iOS - 獲取設備標識符UUID/UDID/IMEI等 總結(jié) 目前最佳獲取設備的唯一標識方案:UUID+...
    上發(fā)條的樹閱讀 7,686評論 0 1
  • 我的人生過往糜烹,一切的不幸或幸福我都可以統(tǒng)統(tǒng)接納,但卻留下一個遺憾無法啟齒漱凝!這是一份無法繼續(xù)的緣分疮蹦,不是我...
    語默若語閱讀 481評論 0 0