UIViewController的生命周期笔记 by STP

UIViewController的生命周期

当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、 alloc                                    创建对象,分配空间
2、init (initWithNibName)          初始化对象,初始化数据
3、loadView                              从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad                        载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear                    视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear                    视图已在屏幕上渲染完成

当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear                视图将被从屏幕上移除之前执行
2、viewDidDisappear                视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc                                 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

最后还要考虑一个重要的情况:内存不足警告。当程序收到内存警告的时候,会调用每一个ViewController的didReceiveMemoryWarning方法,我们需要做出相应,释放程序中暂时不需要的资源;通常都会重写该方法,重写的时候注意要先[super didReceiveMemoryWarning]。

iOS3.0 - iOS6.0期间,didReceiveMemoryWarning方法会判断当前ViewController的view是否显示在window上,如果没有显示在window上,则didReceiveMemoryWarning会自动将ViewController的view以及其所有子view全部销毁,然后调用View Controller的viewDidUnload方法。但是从iOS6.0开始,viewDidUnload和viewWillUnload这两个方法已被废除,收到low-memory时系统不会释放view,而只是释放controller的resource。


loadView与viewDidLoad的区别

这里需要说一下loadView与viewDidLoad的区别:当loadView时,还没有view;而viewDidLoad时,view已经创建好了。详细的加载循环:

step 1:程序请求ViewController的view属性

step 2:如果view在内存中,则直接加载;如果不存在,则调用loadView方法

step 3:loadView方法执行如下方法:

  • 如果重载了这个方法,则必须创建必要的UIView并且将一个非nil值传给ViewController的view属性。
  • 如果没有重载这个方法,ViewController会默认使用自己的nibName和nibBundle属性尝试从nib文件加载view。如果没有找到nib文件,它尝试寻找一个与ViewController类名匹配的nib文件。
  • 如果没有可用的nib文件,那么它创建一个空的UIView作为它的view。

你可能感兴趣的:(生命周期)