视图是应用的一个重要组成,而视图控制器控制着视图,其重要性在整个应用中不言而喻。本文章将对视图的克制对象的生命周期执行的方法进行介绍;
1、视图创建方法init和loadView:
如果在初始化UIViewController指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件,例如:
[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 对应到视图类会执行方法:
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
如果没有明显地传xib文件名,就会加载跟UIViewController同名的xib文件,例如:
[[MyViewController alloc] init]; // 加载MJViewController.xib
如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性,大致如下:
self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
手动创建界面时才需要重写loadView,其它时候初始化操作在viewDidLoad里做就好了;
如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],因为上面已经提到:若没有xib文件,[super loadView]默认会创建一个空白的UIView。我们既然要通过代码来自定义UIView,那么就没必要事先创建一个空白的UIView,以节省不必要的开销。正确的做法应该是这样:
- (void)loadView {
self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
}
此时不需要调用[super loadView],会造成了一些不必要的开销,你调用了也不会出错。
总结一句话,苹果设计这个方法就是给我们自定义UIViewController的view用的
viewDidLoad:
在视图控制器已经被实例化,视图被加载到内存中时调用viewDidLoad方法,这时候视图并未出现。该方法通常进行的是对所控制的视图进行初始化处理。PS:不管你是通过xib文件还是重写loadView创建UIViewController的view,在view创建完毕后,最终都会调用viewDidLoad方法。viewDidLoad在应用时只调用一次。
2、视图可见方法:viewWillAppear:、viewDidAppear:、viewWillDisappear:、viewDidDisappear
视图可见前后会调用viewWillAppear:方法和viewDidAppear:方法;视图不可见前后会调用viewWillDisappear:方法和viewDidDisappear:方法;4个方法调用父类相应的方法以实现其功能,编码时该方法的 位置可根据实际情况进行调整;这4个方法可以被反复多次进行调用;
3、系统低内存:
didReceiveMemoryWarning:和
viewDidUnLoad:方法
在低内存情况下,IOS会调用didReceiveMemoryWarning:和viewDidUnload:方法,didReceiveMemoryWarning:方法的主要职能是释放内存,包括视图控制器中的一些成员变量和视图的释放:例如:
-(void)
didReceiveMemoryWarning
{
self.myButton = nil;
self.myLabel = nil;
[super didReceiveMemoryWarning];
}
viewDidUnload 就是当 view 被卸载以后执行的语句,它与 viewDidLoad 是相互呼应的。在ios 6之后,就不在使用viewDidUnload,而仅仅支持didReceiveMemoryWarning:
4、视图释放与销毁:dealloc
dealloc 是当前 viewController 被释放的时候,清空所有当前 viewController 里面的实体和数据来释放内存,该方法是自动调用的,无需手动执行。例如当 一个实例化myControllerView被 dismissModalViewControllerAnimated 或者navigationController回到上一页的时候,这个方法就会被自动调用。因为这个页面已经不再使用了,所以可以把所有实体和数据都释放(release)掉。
与viewDidUnload区别:viewDidUnload是内存除当前以外所有viewController同时执行,而dealloc只是当前viewController执行。
参考链接:
http://blog.csdn.net/weasleyqi/article/details/8090373
http://blog.csdn.net/q199109106q/article/details/8614044
http://www.cnblogs.com/pengyingh/articles/2342948.html