控制器的声明周期

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;//确保下次重新加载
        }
    }
}

你可能感兴趣的:(控制器的声明周期)