谈到iOS的控制器的生命周期一般都是涉及一些函数的调用顺序。因此,我们在ViewController里进行如下测试:
//
// ViewController.m
// 视图控制器生命周期测试
//
// Created by hst on 16/4/20.
// Copyright © 2016年 hst. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
/**
初始化
*/
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self==[super initWithCoder:aDecoder]) {
NSLog(@"initWithCoder called");
}
return self;
}
/**
视图加载完毕
注:一个UIViewController的一个生命周期内这个函数只会被调用一次
*/
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"viewDidLoad called");
}
/**
view将要出现,每次view消失再出现都会调用这个方法
*/
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"viewWillAppear called");
}
/**
view已经出现在屏幕上的时候调用
*/
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"viewDidAppear called");
}
/**
loadview之前的工作放在这里做
*/
-(void)awakeFromNib
{
NSLog(@"awakeFromNib called");
}
/**
简要对子视图进行布局
*/
-(void)viewWillLayoutSubviews
{
NSLog(@"viewWillLayoutSubviews called");
}
/**
完成对子视图的布局
*/
-(void)viewDidLayoutSubviews
{
NSLog(@"viewDidLayoutSubviews called");
}
@end
输出结果为:
2016-04-20 22:14:08.993 视图控制器生命周期测试[818:21947] initWithCoder called
2016-04-20 22:14:08.994 视图控制器生命周期测试[818:21947] awakeFromNib called
2016-04-20 22:14:08.999 视图控制器生命周期测试[818:21947] viewDidLoad called
2016-04-20 22:14:08.999 视图控制器生命周期测试[818:21947] viewWillAppear called
2016-04-20 22:14:09.003 视图控制器生命周期测试[818:21947] viewWillLayoutSubviews called
2016-04-20 22:14:09.004 视图控制器生命周期测试[818:21947] viewDidLayoutSubviews called
2016-04-20 22:14:09.006 视图控制器生命周期测试[818:21947] viewDidAppear called
由上可知调用顺序为:
1 init函数(init;initWithFrame;initWithCoder;等)
2 awakeFromNib
3 viewDidLoad
4 viewWillAppear
5 viewWillLayoutSubviews
6 viewDidLayoutSubviews
7 viewDidAppear
---上述代码里不含以下两个函数,但是它们在视图控制器的生命周期内
8 viewWillDisappear--View将要消失
9 viewDidDisappear--View已经消失
这九个就是通常的视图控制器生命周期内函数调用顺序,一定要清楚什么样的代码应该放在视图控制器生命周期的什么位置。
通常创建项目的时候会自动生成didReceiveMemoryWarning这个函数,它通常也在生命周期的考虑范围内,当内存不足时候会调用,这时候应当进行适当的内存释放,不然IOS会强制关闭当前的APP。
如有错误,敬请指出。