ViewController的初始化
- 从Storyboards中加载的时候,会调用initWithCode,如果不存在则调用init。之后对里面的每个对象调用awakeFromNib方法
// StoryBoard加载的控制器 会调用改方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
}
return self;
}
// XIB 加载控制器调用该方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
if ([super initWithNibName:nibNameOrNil bundle:nibNameOrNil]) {
}
return self;
}
ViewController查找与其关联的view,其顺序是:
- 先判断子类是否重写了loadView,如果有直接调用。之后调viewDidLoad完成View的加载。
// 通常自定义View的时候使用
- (void)loadView
{
self.view = [[UIImageView alloc] init];
}
- 如果是外部通过调用initWithNibName:bundle指定nib文件名的话,ViewController记载此nib来创建View。
- 如果initWithNibName:bundle的name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib。
ViewController的卸载View的步骤:
- 系统发出内存警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
- 如果此时view没有被加入到任何视图树上,则调用viewWillUnload之后释放View
- 调用viewDidUnload
注意
:
- 如果viewController从创建到销毁期间都没有内存警告,那么这两个函数将始终不会被调用。
- iOS6已将viewWillUnload和viewDidUnload废弃,原因是UIKit在内存警告的时候已经不会自动释放无用的视图。
声明周期方法
/**
* 从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
*/
- (void)loadView
{
[super loadView];
XMGFunc;
}
/**
* 1 init函数 初始化对象
*/
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
XMGFunc;
}
return self;
}
/**
* 视图载入完成,可以进行自定义数据以及动态创建其他控件
*/
- (void)viewDidLoad {
[super viewDidLoad];
XMGFunc;
self.title = @"MainVC";
}
/**
* 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了,每次视图消失再出现都会再次调用,通常我们会利用这个方法,对即将显示的视图做进一步的设置。例如,我们可以利用这个方法来设置设备不同方向时该如何显示。在视图间切换时,并不会再次载入viewDidLoad方法,所以如果在调入视图时,需要对数据做更新,就只能在这个方法内实现了。
*/
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
XMGFunc;
}
/**
* 视图已在屏幕上渲染完成,有时候,由于一些特殊的原因,我们不能在viewWillApper方法里,对视图进行更新。那么可以重写这个方法,在这里对正在显示的视图进行进一步的设置
*/
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
XMGFunc;
}
/**
* 完成对子视图布局
*/
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
XMGFunc;
}
/**
* 将要要对子视图进行布局
*/
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
XMGFunc;
}
/**
* 在loadView之前的工作放在这里
*/
- (void)awakeFromNib
{
XMGFunc;
}
/**
* 视图将被从屏幕上移除之前执行,在视图变换时,当前视图在即将被移除、或者被覆盖时,会调用这个方法进行一些善后的处理和设置。
*/
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
XMGFunc;
}
/**
* 视图已经被从屏幕上移除,用户看不到这个视图了,我们可以重写这个方法,对已经消失,或者被覆盖,或者已经隐藏了的视图做一些其他操作。
*/
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
/**
* 当程序收到内存警告的时候,会调用每一个ViewController的didReceiveMemoryWarning方法,我们需要做出相应,释放程序中暂时不需要的资源;通常都会重写该方法,但记得重写的时候要调用super的该方法。
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。
*/
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
XMGFunc;
//当前iOS系统的版本号
float ver = [[[UIDevice currentDevice] systemVersion] floatValue];
if (ver >= 6.0f) {
//判断视图是否被装载进内存,并且是否为当前视图
if (self.isViewLoaded && !self.view.window) {
//将self.view置为nil,确保调用该viewController时,loadView和viewDidLoad再次调用
self.view = nil;//确保下次重新加载
}
}
}