未使用storyboard程序啟動(dòng)的完整過(guò)程如下:
1.main 函數(shù)
2.UIApplicationMain
? ? ?*創(chuàng)建UIApplication對(duì)象
? ? *創(chuàng)建UIApplication的delegate對(duì)象
? ? *delegate對(duì)象開(kāi)始處理(監(jiān)聽(tīng))系統(tǒng)事件(沒(méi)有storyboard)
? ? ?*程序啟動(dòng)完畢的時(shí)候, 就會(huì)調(diào)用代理的application:didFinishLaunchingWithOptions:方法
? ? ?*在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
? ? ?*創(chuàng)建和設(shè)置UIWindow的rootViewController
? ? ?*顯示窗口
3.根據(jù)Info.plist獲得最主要(main)storyboard的文件名,加載最主要的storyboard(有storyboard)
? ? ?*創(chuàng)建UIWindow
? ? ?*創(chuàng)建和設(shè)置UIWindow的rootViewController
? ? ?*顯示窗口
ViewController中的加載順序
1.loadView
2.viewDidLoad
3.viewWillAppear
4.viewWillLayoutSubviews
5.viewDidLayoutSubviews
6.viewDidAppear
View中的加載順序
1.initWithCoder(如果沒(méi)有storyboard就會(huì)調(diào)用initWithFrame粟矿,這里兩種方法視為一種)
2.awakeFromNib
3.layoutSubviews
4.drawRect
一些方法的使用時(shí)機(jī)
+?(void)load:應(yīng)用程序啟動(dòng)就會(huì)調(diào)用的方法钝荡,在這個(gè)方法里寫(xiě)的代碼最先調(diào)用。
+?(void)initialize:用到本類(lèi)時(shí)才調(diào)用,這個(gè)方法里一般設(shè)置導(dǎo)航控制器的主題等映凳,如果在后面的方法設(shè)置導(dǎo)航欄主題就太遲了肛响!
-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary*)launchOptions:這個(gè)方法里面會(huì)創(chuàng)建UIWindow瓜挽,設(shè)置根控制器并展現(xiàn)回铛,比如某些應(yīng)用程序要加載授權(quán)頁(yè)面也是在這加,也可以設(shè)置觀察者跋炕,監(jiān)聽(tīng)到通知切換根控制器等赖晶。
-?(void)awakeFromNib:在使用IB的時(shí)候才會(huì)涉及到此方法的使用,當(dāng).nib文件被加載的時(shí)候辐烂,會(huì)發(fā)送一個(gè)awakeFromNib的消息到.nib文件中的每個(gè)對(duì)象遏插,每個(gè)對(duì)象都可以定義自己的awakeFromNib函數(shù)來(lái)響應(yīng)這個(gè)消息,執(zhí)行一些必要的操作棉圈。在這個(gè)方法里設(shè)置view的背景等一系列普通操作涩堤,注意,在iOS8以后分瘾,此方法中還未獲取到view的frame胎围。
-?(void)loadView:創(chuàng)建視圖的層次結(jié)構(gòu)吁系,在沒(méi)有創(chuàng)建控制器的view的情況下不能直接寫(xiě) self.view 因?yàn)閟elf.view的底層是:
if(_view?==?nil){
_view?=?[self?loadView]
}
這么寫(xiě)會(huì)直接造成死循環(huán)。如果重寫(xiě)這個(gè)loadView方法里面什么都不寫(xiě)白魂,會(huì)顯示黑屏汽纤。
- (void)viewDidLoad:這里只是把視圖元件加載完成,還沒(méi)有開(kāi)始布局不要設(shè)置關(guān)于 frame 之類(lèi)的屬性福荸!
- (void)viewWillAppear:(BOOL)animated:視圖將要出現(xiàn)蕴坪,這個(gè)方法用的非常多,比如監(jiān)聽(tīng)屏幕旋轉(zhuǎn)敬锐,viewWillTransitionToSize:可能要在本方法里再調(diào)一次背传。
-?(void)viewWillLayoutSubviews:視圖將要布局子視圖,蘋(píng)果建議的設(shè)置界面布局屬性的方法台夺,這個(gè)方法和viewWillAppear里径玖,系統(tǒng)的底層都是沒(méi)有寫(xiě)任何代碼的,也就是說(shuō)這里面不寫(xiě)super 也是可以的颤介。
- (void)layoutSubviews:在這個(gè)方法里一般設(shè)置子控件的frame梳星,這里相當(dāng)于是布局基本完成了,設(shè)置時(shí)取到的frame或者是self.bounds才最準(zhǔn)滚朵。記得要調(diào)用[super layoutSubviews];
-?(void)drawRect:(CGRect)rect:UI控件都是畫(huà)上去的冤灾,在這一步就是把所有的東西畫(huà)上去。drawRect方法只能在加載時(shí)調(diào)用一次辕近,如果后面還需要調(diào)用韵吨,比如下載進(jìn)度的圓弧,需要一直刷幀移宅,就要使用setNeedsDisplay來(lái)定時(shí)多次調(diào)用本方法学赛。
-?(void)applicationDidBecomeActive:(UIApplication?*)application:這是AppDelegate的應(yīng)用程序獲取焦點(diǎn)方法,真正到了這里吞杭,才是所有東西全部加載完畢。