对象的生命周期是个很重要的概念:

生命周期控制函数不是简单的一个,而是一个序列:

//类的初始化方法
+ (void)initialize;
//对象初始化方法
- (instancetype)init;
//从归档初始化
- (instancetype)initWithCoder:(NSCoder *)coder;
//加载视图
-(void)loadView;
//将要加载视图
- (void)viewDidLoad;
//将要布局子视图
-(void)viewWillLayoutSubviews;
//已经布局子视图
-(void)viewDidLayoutSubviews;
//内存警告
- (void)didReceiveMemoryWarning;
//已经展示
-(void)viewDidAppear:(BOOL)animated;
//将要展示
-(void)viewWillAppear:(BOOL)animated;
//将要消失
-(void)viewWillDisappear:(BOOL)animated;
//已经消失
-(void)viewDidDisappear:(BOOL)animated;
//被释放
-(void)dealloc;

在这里面 有我们熟悉的init/viewDidLoad/ViewDidAppear等等。

除了initialize,init和initWithCoder不是存在所有对象的声明周期中,其他函数都会在UIViewController的声明周期中有序的被调用。

下面来看一下视图控制器加载视图的整个流程:

当你controller的view属性被第一次请求时,如果这时候view还不在内存里,就会触发对应的加载view的事件。
首先被调用的是loadView方法,这个方法是加载view的过程,如果你没有特殊需要不要乱重载此方法。loadView会判断并使用正确的代码来创建好一个view(见图),创建好了之后就触发viewDidLoad方法,这时候我们就可以做一些加载view之后的自定义操作了。viewDidLoad也处理完之后,controller的view属性就准备好了可以被各处调用了。

接下来谈一下Controller的生命周期:

系统提供了控制器从显示到消失的四个方法。

千万不要看到方法名中间出现了view就以为这是视图的方法。这些都是控制器的生命周期。

//将要显示,一定要调用super
- (void)viewWillAppear:(BOOL)animated; // Called when the view is about to made visible. Default does nothing

//视图已经显示
- (void)viewDidAppear:(BOOL)animated; // Called when the view has been fully transitioned onto the screen. Default does nothing

//视图将要消失
- (void)viewWillDisappear:(BOOL)animated; // Called when the view is dismissed, covered or otherwise hidden. Default does nothing

//视图已经消失
- (void)viewDidDisappear:(BOOL)animated; // Called after the view was dismissed, covered or otherwise hidden. Default does nothing

refer:

https://www.jianshu.com/p/fa641a7a0683