控制器的生命周期
1.loadView
1.1 如果重寫了控制器的loadView方法,則控制器的View按照loadView方法的描述去創(chuàng)建
- (void)loadView
{
self.view = [[UIView alloc ]init];
self.view.backgroundColor = [UIColor redColor];
}
1.2 如果沒重寫控制器的loadView方法,則看有沒有storyboard的,有的話,則按storyboard的描述創(chuàng)建view
加載storyboard的方法:
1>在project--targets--MainInterface指定storyboard
2>代碼加載
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
UIStoryboard *myStoryboard = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil];
self.window.rootViewController = [myStoryboard instantiateInitialViewController];
[self.window makeKeyAndVisible];
return YES;
}
1.3 如果沒有storyboard,則看初始化控制器的時候,有沒有指定nibName,指定了的話,就按nibName對應(yīng)的xib創(chuàng)建view
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
self.window.rootViewController = [[QKViewController alloc]initWithNibName:@"myViewController" bundle:nil];
[self.window makeKeyAndVisible];
return YES;
}
1.4 如果沒有指定nibName,假設(shè)控制器名字是QKViewController,則程序優(yōu)先尋找名字為QKView.xib,找到了的話,則按QKView.xib創(chuàng)建view
1.5 如果沒有找到QKView.xib,則尋找QKViewController.xib,找到了的話,則按QKViewController.xib創(chuàng)建view
前面5步的流程圖:
技術(shù)分享
2.前面5步實際都是在做loadView,做完這一步之后,就調(diào)用viewDidLoad,只會被調(diào)用一次
3.在視圖顯示之前調(diào)用viewWillAppear,該函數(shù)可以被多次調(diào)用
4.視圖顯示完畢,調(diào)用viewDidAppear
5.在視圖消失之前,調(diào)用viewWillDisApperar,該函數(shù)可以被多次調(diào)用
6.在布局變化前后,調(diào)用viewWillLayoutSubviews\viewDidLayoutSubviews
7.控制器還有三個方法需要注意:viewWillUnload\viewDidUnload\didReceiveMemoryWarning
- 當(dāng)程序內(nèi)存不夠用時,最先拿到內(nèi)存警告的是UIApplication→Window→Window.rootViewController→.....(一層一層往下傳)
控制器收到內(nèi)存警告時,如果要確定要銷毀View,則會調(diào)用viewWillUnload\viewDidUnload.
控制器是這樣判斷View是否需要銷毀的: