亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

對應用程序啟動時所有方法的調用順序分析

2019-11-14 19:28:53
字體:
來源:轉載
供稿:網友

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

如果你不是在董鉑然博客園看到本文,請點擊查看原文

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

①.先加載Main函數

②.在Main函數里的 UIapplicationMain方法中,創建Application對象 創建Application的Delegate對象

③.創建主循環,代理對象開始監聽事件

④.啟動完畢會調用 didFinishLaunching方法,并在這個方法中創建UIWindow

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

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

⑦.顯示窗口

 

本文考慮的時步驟③之后到步驟⑦結束時將要調用的方法

其中有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就會調用initWithFrame,這里兩種方法視為一種)

12.awakeFromNib

13.layoutSubviews

14.drawRect

 

ChildView(子控件View)中的:

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

16.awakeFromNib

17.layoutSubviews

18.drawRect

 

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

 

 

下面的圖是Xcode6.3的beta2版  

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

 

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

 

+ (void)load;

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

 

+ (void)initialize;

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

 

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

3.這個方法里面會創建UIWindow,設置根控制器并展現,比如某些應用程序要加載授權頁面也是在這加,也可以設置觀察者,監聽到通知切換根控制器

 

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

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

 

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

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

 

MainView - (void)awakeFromNib;

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

 

ChildView - (void)awakeFromNib

7.子控件也有本方法,重寫父類的方法?;居梅ㄍ?nbsp;

 

- (void)loadView;

 8.創建視圖的層次結構,這里需要注意,在沒有創建控制器的view的情況下不能直接寫 self.view 因為self.view的底層是:

if(_view == nil){

  _view = [self loadView]

}

所以這么寫會直接造成死循環。

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

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

如果不在這個方法中,init的底層是會調用initWithNibName的,如果名字是MainViewController,會先在項目中找MainView.xib 找不到會再找MainViewController.xib。 

 

- (void)viewDidLoad;

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

 

- (void)viewWillAppear:(BOOL)animated;

10.視圖將要出現,這個方法用的非常多,比如如果要設置導航欄的setNavigationBarHiden:animate: 就必須要在這里寫,才能完美契合,不卡跳。 還有很多比如監聽屏幕旋轉啦,

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

 

- (void)viewWillLayoutSubviews;

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

 

MainView  - (void)layoutSubviews;

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

 

- (void)viewDidLayoutSubviews;

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

 

ChildView - (void)layoutSubviews;

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

 

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

15. 因為默認所有額UI控件都是畫上去的,在這一步就是把所有的東西畫上去,有時候需要用到Quartz2D的知識的時候都是在這個方法里話,但也是要注意別忘了寫super,不然系統原本的東西就都畫不上來了,這里要建議盡可能使用貝塞爾路徑畫圖形,因為系統默認的那個上下文畫法有時可能會內存泄露。drawRect方法只能在加載時調用一次,如果后面還需要調用,比如下載進度的圓弧,需要一直刷幀,就要使用setNeedsDisplay來定時多次調用本方法

 

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

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

 

- (void)viewDidAppear:(BOOL)animated;

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

 

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

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

 

如果你不是在董鉑然博客園看到本文,請點擊查看原文

以上總結,有不同意見的歡迎交流,歡迎關注 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
全球成人中文在线| 国产美女直播视频一区| 日韩一区二区精品视频| 欧美日韩免费一区| 久久久久99精品久久久久| 大荫蒂欧美视频另类xxxx| 亚洲精品动漫100p| 精品视频在线观看日韩| 亲子乱一区二区三区电影| 欧美孕妇毛茸茸xxxx| 欧美成人精品三级在线观看| www.国产一区| 亚洲精品视频在线观看视频| 欧美日本黄视频| 久久免费成人精品视频| 亚洲午夜小视频| 亚洲综合国产精品| 亚洲第一区在线观看| 成年无码av片在线| 国产精品永久免费在线| 欧美成人在线网站| 成人午夜一级二级三级| 国产精品色婷婷视频| 97人洗澡人人免费公开视频碰碰碰| 日韩成人在线观看| 中文欧美日本在线资源| 欧美精品性视频| 国产精品久久久久久中文字| 国产亚洲福利一区| 国产精品亚洲一区二区三区| 欧美日韩一区二区免费视频| 日本午夜精品理论片a级appf发布| 亚洲新声在线观看| 日韩av电影国产| 91精品视频在线看| 国产精品日本精品| 国产成人黄色av| 国产精品欧美日韩| 日韩成人中文字幕在线观看| 精品国产老师黑色丝袜高跟鞋| 成人精品一区二区三区电影免费| 人体精品一二三区| 精品福利一区二区| 久久激情视频久久| 日韩精品中文字幕在线播放| 久久精品国产成人| 欧美性videos高清精品| 亚洲自拍偷拍在线| 欧美性猛交xxxx免费看| 4438全国亚洲精品在线观看视频| 欧美激情免费观看| 国产欧美久久久久久| 欧美精品在线视频观看| 日韩亚洲成人av在线| 亚洲国产精久久久久久久| 欧洲成人性视频| 国产精品久久久一区| 亚洲欧美日韩图片| 在线观看国产欧美| 国产精品久久久久久av福利软件| 热久久这里只有精品| 精品久久在线播放| 精品亚洲一区二区三区在线播放| 亚洲自拍偷拍网址| 亚洲第一网站男人都懂| 国产极品jizzhd欧美| 日韩视频免费看| 91色在线视频| 色播久久人人爽人人爽人人片视av| 性欧美办公室18xxxxhd| 成人淫片在线看| 中文综合在线观看| 亚洲色图激情小说| 国产剧情久久久久久| 国产精品色午夜在线观看| 少妇高潮 亚洲精品| 国产成人综合久久| 国产精品99一区| 91免费高清视频| 国内精品模特av私拍在线观看| 久久伊人色综合| 日韩精品视频在线观看网址| 久久久天堂国产精品女人| 北条麻妃一区二区三区中文字幕| 在线精品高清中文字幕| 欧美在线亚洲在线| 国产成人综合一区二区三区| 在线成人免费网站| 国产日韩在线播放| 久久色精品视频| 成人性生交大片免费看视频直播| 97超级碰在线看视频免费在线看| 亚洲第一福利网站| 久久久中精品2020中文| 亚洲香蕉成视频在线观看| 久久精品夜夜夜夜夜久久| 日韩成人高清在线| 欧美在线视频一区| 欧美成aaa人片在线观看蜜臀| 欧美精品手机在线| 在线电影av不卡网址| 国产精品久久久久久搜索| 日本高清视频精品| 久久香蕉精品香蕉| 中文字幕在线精品| 久久黄色av网站| 成人在线小视频| 久久久久久亚洲精品中文字幕| 粗暴蹂躏中文一区二区三区| 中文字幕国产亚洲| 亚洲视频在线观看网站| 亚洲区bt下载| 日韩精品视频在线免费观看| 欧美成人免费在线视频| 精品美女国产在线| 国产精品男人爽免费视频1| 精品国产精品三级精品av网址| 国产精品专区h在线观看| 亚洲精品一区中文| 欧洲美女7788成人免费视频| 欧美日韩一区二区三区在线免费观看| 国产成人亚洲综合91| 中文字幕日韩专区| 宅男66日本亚洲欧美视频| 欧美视频免费在线| 欧美激情免费看| 欧美插天视频在线播放| 国产主播在线一区| 亚洲精品久久久久久久久| 在线看国产精品| 欧美精品在线免费播放| 狠狠躁夜夜躁久久躁别揉| 国产精品永久免费视频| 亚洲欧美国内爽妇网| 亚洲国产婷婷香蕉久久久久久| 色综合天天综合网国产成人网| 久久久精品在线| 久久国产精品久久久久| 日韩欧美中文字幕在线播放| 57pao国产成人免费| 日本国产精品视频| 成人黄色中文字幕| 国产精品视频网| 91亚洲国产成人精品性色| 91成人在线观看国产| 精品福利樱桃av导航| 国产精品美女久久久免费| 亚洲天堂开心观看| 亚洲自拍偷拍网址| 九九热视频这里只有精品| 韩国视频理论视频久久| 中文字幕av一区| 亚洲精品视频久久| 亚洲jizzjizz日本少妇| 精品国产鲁一鲁一区二区张丽| 国产婷婷97碰碰久久人人蜜臀| 久久久久久高潮国产精品视| 欧美巨乳美女视频| 日韩欧美中文在线| 欧美日韩国产激情| 欧美激情综合色综合啪啪五月| 久久久久久久久国产精品| 午夜剧场成人观在线视频免费观看| 国产成人激情小视频|