UIViewController 的生命周期研究
首先我们来写点测试代码:
image.png
运行代码,然后触摸屏幕,会push到下一个界面,然后我们返回,我们来看看控制台输出的信息
image.png
ViewController这么多生命周期,我们代码该写在哪儿呢?
loadView
1、创建或加载一个view并把它赋值给UIViewController的view属性;
2、当执行到loadView方法时,如果视图控制器是通过nib创建,那么视图控制器已经从nib文件中被解档并创建好了,接下来任务就是对view进行初始化;
3、在UIViewController对象的view被访问且为空的时候调用,比如self.view = nil。因此loadView方法在视图控制器的生命周期内可能被调用多次。
4、不应该直接被调用,而是由系统调用。它会加载或创建一个view并把它赋值给UIViewController的view属性;
在创建view的过程中,首先会根据nibName去找对应的nib文件然后加载。如果nibName为空或找不到对应的nib文件,则会创建一个空视图(这种情况一般是纯代码)
viewDidLoad
在这一步,整个视图层次已经保存在内存中,可以做各种初始化数据的载入、初始设定、移除一些视图,修改约束,加载数据等。
viewWillAppear
视图加载完成,并即将显示在屏幕上。系统在载入所有的数据后,将会在屏幕上显示视图,这时会先调用这个方法,通常我们会在这个方法对即将显示的视图做进一步的设置。比如,设置设备不同方向时该如何显示、设置状态栏方向、设置视图显示样式等。
viewWillLayoutSubviews
即将开始子视图位置布局。view即将布局子视图。 比如view的bounds改变了,要调整子视图的位置,在调整之前要做的工作可以放在该方法中实现。
viewDidLayoutSubviews
子视图的位置布局已经完成。view已经把子视图的位置布局好了,这里可以放置布局完成之后需要做的工作。
viewDidAppear
视图已经展示在屏幕上,可以对视图做一些关于展示效果方面的修改。在view被添加到视图层级中、多视图切换、上下级视图切换(push/pop)时,会调用这个方法,在这里可以对正在显示的视图做进一步的设置。
viewWillDisappear
视图即将消失。在视图切换时、当前视图即将被移除时、当前视图即将被覆盖时,会调用该方法,此时还没有调用removeFromSuperview。
viewDidDisappear
view已经消失或被覆盖,此时已经调用removeFromSuperView。
dealloc
视图被销毁时调用。由系统自动调用,不能手动调用。会对你创建的对象进行释放。
didReceiveMemoryWarning
在内存足够的情况下,app的视图通常会一直保存在内存中,但是如果内存不够,一些没有正在显示的ViewController就会收到内存不足的警告,然后就会释放自己拥有的视图,以达到释放内存的目的。但是系统只会释放内存,并不会释放对象的所有权,所以通常我们需要在这里将不需要显示在内存中保留的对象释放它的所有权,将其指针置nil。