^_^嗨一下
文章目录
  1. 一、LoadView
  2. 二、ViewDidLoad
  3. 三、ViewDidUnload
  4. 四、ViewWillAppear、ViewDidAppear
  5. 四、ViewWillDisappear、ViewDidDisAppear

我们在进行IOS手机开发的时候,理解原生方法的执行次序,以及执行原理是非常重要的,我们在开发的过程当中,有的时候就是对IOS执行方法的次序及机制不够了解,进而容易犯一些比较低级的错误,而这些错误我们是完全可以轻易避免的。这篇文章是我对UIViewController里边的几个方法的调用次序做一个总结,希望以后对自己或者浏览者有用。

一、LoadView

简单来说loadView方法是用来负责创建UIViewController的view的,也就是说当UIViewController的nib为nil的时候调用。它有两种调用方式,一种是我们重载了此方法,另一种是如果没重载调用[super loadView]

下面我们说说没重载的情况,也就是[super loadView]会怎样做创建view的事情
1.它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view,如果在初始化UIViewController指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件 ,方法为

1
[[XibViewController alloc] initWithNibName:@"XibViewController" bundle:nil];

如果没有明显地传xib文件名,就会加载跟UIViewController同名的xib文件

1
[[XibViewController alloc] init];//加载XibViewController.xib

2.如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性

1
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];

我们如果不希望view按上面的方式加载,那么我们也可以通过自己定义一种希望的view控件进行加载比如加载一个UIWebView

1
self.view = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];

当然此时不需要调用[super loadView]了,即使你调用了也不会出错,只是造成了一些不必要的开销。

二、ViewDidLoad

viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用。重载重写该方法以进一步定制符合需求的view,比如往view中添加一些子视图、从数据库或者网络加载模型数据装配到子视图中

1
2
3
4
5
6
7
- (void)viewDidLoad{
[super viewDidLoad];
// 添加一个按钮
UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
[self.view addSubview:button];
}

三、ViewDidUnload

要知道iOS设备的内存是极其有限的,如果应用程序占用的内存过多的话,系统就会对应用程序发出内存警告。UIViewController就会收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默认实现是:如果当前UIViewController的view不在应用程序的视图层次结构(View Hierarchy)中,即view的superview为nil的时候,就会将view释放,并且调用viewDidUnload方法,所以一般在释放资源,主要是释放界面元素相关的资源,将相关的实例都赋值为nil

1
2
3
4
5
- (void)viewDidUnload {
[super viewDidUnload];
self.name = nil;
self.pwd = nil;
}

四、ViewWillAppear、ViewDidAppear

1.当你调用pushViewController:animated把一个视图控制器压入UINavigationController的时候,UINavigationController会自动调用这些方法。
2.当你tabs时,UITabBarController会直接调用这些方法
3.当你使用presentModalViewController时也会调用方法。
总之当一个视图控制器的视图被添加到一个window中时也会调用这些方法

记住,这些方法只在这些特定的情况下控制器pushed或presented的时候被调用。在其它的情况下不会被调用,比如你添加你的视图控制器的视图作为一个视图的子视图而不是作为window的子视图。苹果官方文档说视图控制器仅用于全屏显示的视图,典型的是使用上面提到的方法。可以忽略苹果的建议使一个视图控制器关联另一个视图控制的的视图作为子视图,但是你需要在作为容器的视图控制器中手动的调用嵌套控制器的viewWillAppear和viewDidAppear。

四、ViewWillDisappear、ViewDidDisAppear

对应上面的
1.当你调用PopViewController:animated把一个视图控制器退出UINavigationController的时候,UINavigationController会自动调用这些方法。
2.当你切换到tabs里的另外的视图时时,UITabBarController会直接调用这些方法
3.当你使用dismissModalViewControllerAnimated时也会调用方法。
总之当一个视图控制器的视图移除window时会调用这些方法

对上面几个方法的调用时机总结完了,我们可以流畅的使用了。总体次序呢如下
LoadView->viewDidLoad->viewWillAppear->viewDidAppear->viewWillDisappear->viewDidDisappear
关心内存的就是ViewDidUnload。

文章目录
  1. 一、LoadView
  2. 二、ViewDidLoad
  3. 三、ViewDidUnload
  4. 四、ViewWillAppear、ViewDidAppear
  5. 四、ViewWillDisappear、ViewDidDisAppear