https://github.com/puyuerong/UIViewController
初始化ViewController本身。
若loadView未加载view, 将导致ViewDidLoad和LoadView死循环
每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。
loadView方法是用来负责创建UIViewController的view
默认实现即[super loadView]里面做了什么事情。
它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view
1> 如果在初始化UIViewController指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件
[[MJViewController alloc] initWithNibName:@“MJViewController” bundle:nil];
如果没有明显地传xib文件名,就会加载跟UIViewController同名的xib文件
[[MJViewController alloc] init]; // 加载MJViewController.xib
2> 如果没有找到相关联的xib文件,就会创建一个空白的UIView, 然后赋值给UIViewController的view属性,大致如下
self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
[super loadView]里面就大致完成1>和2>中叙述的内容
当VC的view对象载入内存后调用,用于对view进行额外的初始化操作。
loadView时还没有view,而viewDidLoad时view已经创建好了。
在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用
UIViewController对象的视图即将加入窗口时调用;
UIViewController对象的视图已经加入到窗口时调用;
UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;
UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;
(释放无用内存)
当系统内存吃紧的时候会调用该方法,内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式。
在该方法中将所有IBOutlet(输出口)(无论是property还是实例变量)置为nil(系统release view时已经将其release掉了)。
在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等。
一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行。在ios6.0开始就废弃了,该方法不再会被调用。
替代;Memory warning
调用
1、这个类被release的时候会被调用;
2、这个对象的retain count为0的时候会被调用;
或者说一个对象或者类被置为nil的时候;
释放其他资源或内存。
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数,和OC中的dealloc 一样的,通常在deinit和dealloc中需要执行的操作有:
对象销毁
KVO移除
移除通知
NSTimer销毁
deinit {
// 注销通知 - 注销指定的通知
NotificationCenter.default.removeObserver(self,name: NSNotification.Name(rawValue: kUserDidLogin),object: nil)
}
控制器销毁时(离开堆),调用该方法。
当一个视图的边界发生变化,也就是调整其子视图的位置。你的视图控制器可以重写此方法在layoutSubViews之前生效以重新布局子视图。该方法的默认实现不执行任何操作。
1、addSubview会触发viewWillLayoutSubviews
2、设置self.view及子视图的frame.size会触发layoutSubviews,当然前提是frame.size的值设置前后发生了变化,注意,此处不是origin,呼应官方文档上的边界发生变化
3、滚动一个UIScrollView(该scrollview有子视图的时候)会触发layoutSubviews
4、横竖屏幕切换会触发
布局子视图结束时调用
有两个界面界面1和界面2
2019-09-24 22:22:05.299830+0800 UIViewController的生命周期[2446:73049]
界面1 loadView
2019-09-24 22:23:46.182038+0800 UIViewController的生命周期[2446:73049]
界面1 viewWillAppear
2019-09-24 22:23:46.660182+0800 UIViewController的生命周期[2446:73049]
界面1 viewWillLayoutSubviews
2019-09-24 22:23:46.660513+0800 UIViewController的生命周期[2446:73049]
界面1 viewDidLayoutSubviews
2019-09-24 22:23:46.897848+0800 UIViewController的生命周期[2446:73049]
界面1 viewDidAppear
2019-09-24 22:23:55.305690+0800 UIViewController的生命周期[2446:73049]
界面2 loadView
2019-09-24 22:23:55.566107+0800 UIViewController的生命周期[2446:73049]
界面2 viewDidLoad
2019-09-24 22:23:55.685424+0800 UIViewController的生命周期[2446:73049]
界面1 viewWillDisappear
2019-09-24 22:23:55.825329+0800 UIViewController的生命周期[2446:73049]
界面2 viewWillAppear
2019-09-24 22:24:01.105560+0800 UIViewController的生命周期[2446:73049]
界面2 viewWillLayoutSubviews
2019-09-24 22:24:01.688914+0800 UIViewController的生命周期[2446:73049]
界面2 viewDidLayoutSubviews
2019-09-24 22:24:02.397152+0800 UIViewController的生命周期[2446:73049]
界面2 viewDidAppear
2019-09-24 22:24:02.397361+0800 UIViewController的生命周期[2446:73049]
界面1 viewDidDisappear
2019-09-24 22:24:26.635852+0800 UIViewController的生命周期[1513:27192]
界面2 viewWillDisappear
2019-09-24 22:24:26.735852+0800 UIViewController的生命周期[2446:73049]
界面1 viewWillAppear
2019-09-24 22:24:29.972281+0800 UIViewController的生命周期[2446:73049]
界面1 viewDidAppear
2019-09-24 22:24:32.042184+0800 UIViewController的生命周期[2446:73049]
界面2 viewDidDisappear
2019-09-24 22:24:32.535861+0800 UIViewController的生命周期[2446:73049]
界面2 dealloc
点击Push界面 loadView
2019-09-25 00:20:26.098155+0800 UIViewController的生命周期[3551:112378]
点击Push界面 viewWillAppear
2019-09-25 00:20:26.100593+0800 UIViewController的生命周期[3551:112378]
点击Push界面 viewWillLayoutSubviews
2019-09-25 00:20:26.100755+0800 UIViewController的生命周期[3551:112378]
点击Push界面 viewDidLayoutSubviews
2019-09-25 00:20:26.103486+0800 UIViewController的生命周期[3551:112378]
点击Push界面 viewDidAppear
2019-09-25 00:20:30.250694+0800 UIViewController的生命周期[3551:112378]
点击Pop界面 loadView
2019-09-25 00:20:30.269505+0800 UIViewController的生命周期[3551:112378]
点击Push界面 viewWillDisappear
2019-09-25 00:20:30.269768+0800 UIViewController的生命周期[3551:112378]
点击Pop界面 viewWillAppear
2019-09-25 00:20:30.323096+0800 UIViewController的生命周期[3551:112378]
点击Pop界面 viewWillLayoutSubviews
2019-09-25 00:20:30.323297+0800 UIViewController的生命周期[3551:112378]
点击Pop界面 viewDidLayoutSubviews
2019-09-25 00:20:30.826302+0800 UIViewController的生命周期[3551:112378]
点击Push界面 viewDidDisappear
2019-09-25 00:20:30.826465+0800 UIViewController的生命周期[3551:112378]
点击Pop界面 viewDidAppear
2019-09-25 00:25:01.367372+0800 UIViewController的生命周期[3551:112378]
点击Pop界面 viewWillDisappear
2019-09-25 00:25:01.367535+0800 UIViewController的生命周期[3551:112378]
点击Push界面 viewWillAppear
2019-09-25 00:25:01.875756+0800 UIViewController的生命周期[3551:112378]
点击Pop界面 viewDidDisappear
2019-09-25 00:25:01.876707+0800 UIViewController的生命周期[3551:112378]
点击Push界面 viewDidAppear
2019-09-25 00:25:01.877552+0800 UIViewController的生命周期[3551:112378]
点击Pop界面 dealloc
从界面1present界面2, 界面1不会销毁, 而在界面2dismiss, 界面2会销毁, 所以, 界面1到界面2, 总是要走LoadView, viewDidLoad, layOutSubViews这些方法, 而界面2dismiss会到界面1, 并不会重新走这些方法。
viewDidAppear和viewDidDisappear
在present-dismiss界面交互中
要显示的界面完全显示之后, 上一界面才会消失
在push-pop界面交互中‘上一个界面会先消失, 即将显示的界面才会显示。
loadView中创建viewcontroller的view
viewDidLoad中初始化显示在屏幕上的控件, 此时不布局。
viewWillLayoutSubviews中布局各种view, 包括子视图的view。
其他的方法大多只是提供了可以操作的时机。