UIViewController 生命周期

转自:http://blog.csdn.net/zhz459880251/article/details/49003107

/**
初始化UIViewController,执行关键数据初始化操作,注意这里不要做view相关操作,view在loadView方法中才初始化,这时loadView还未调用。
*/

/**
如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发时自动初始化,因此方法initWithNibName:bundle:不会被调用。
*/
//1.如果用代码创建, 调用

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nil bundle:nil]) {

    }
    return self;
}

/**
如果在代码里面使用instantiateViewControllerWithIdentifier:方法显示初始化一个UIViewController,则initWithCoder方法会被调用
*/
//1.如果用xib, 或 SB创建, 调用

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        NSLog(@"123");
    }
    return self;
}

/**
初始化view, 这时候调用self.view会无限循环, 除非先调用了[supper loadView]
如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。
如果重载loadView方法, 这需先调用[supper loadView], 否则控件不显示
*/
//2.

- (void)loadView {
    [super loadView];
    self.view.backgroundColor = [UIColor grayColor];
}

/**
当VC的view对象载入 内存 后调用,用于对view进行额外的初始化操作
*/
//3.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor greenColor];
    self.myButton.backgroundColor = [UIColor greenColor];

}

/**
在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用(这个时候supperView还是nil)。这个方法中完成任何与视图显示相关的任务,例如改变视图方向、状态栏方向、视图显示样式等
*/
//4.

- (void)viewWillAppear:(BOOL)animated {
    self.view.backgroundColor = [UIColor redColor];
}

/**
view即将布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),要调整Subviews的位置,在调整之前要做的一些工作就可以在该方法中实现。
*/
//5.

- (void)viewWillLayoutSubviews {
    //[super viewWillLayoutSubviews];
    self.myButton.backgroundColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.8 alpha:1.0];
}

/**
view已经布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。
*/
//6.

- (void)viewDidLayoutSubviews {
    //[super viewDidLayoutSubviews];
    self.myButton.backgroundColor = [UIColor grayColor];
}

/**
在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中)。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用[supper viewDidAppear];
*/
//7.

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.view.backgroundColor = [UIColor blueColor];
}

//------------------------移除 视图------------------------
/**
view即将从superView中移除且移除动画切换之前,此时还没有调用removeFromSuperview。
*/
//1.

- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}

/**
view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。
*/
//2.在下一个视图的viewWillAppear: 调用之后, viewDidAppear:调用之前才调用

- (void)viewDidDisappear:(BOOL)animated {
    NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}

ios6.0以后被废弃

- (void)viewWillUnload {
    NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}

- (void)viewDidUnload {
    NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}

补充:

initWithNibName:bundle:
如果是通过调用initWithNibName:bundle指定nib文件名初始化的话,ViewController会根据此nib来创建View。如果name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib:

1)如果ViewController的类名以“Controller”结尾,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
2)找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib
loadView
当访问UIViewController的view属性时,view如果此时是nil,那么VC会自动调用loadView方法来初始化一个UIView并赋值给view属性。此方法用在初始化关键view,需要注意的是,在view初始化之前,不能先调用view的getter方法,否则将导致死循环(除非先调用了[supper loadView];)。

-(void)loadView{

    NSLog(@"loadView");

    //错误,将导致死循环,因此此时view=nil,VC会再次调用loadView来初始化view
    self.view.backgroundColor=[UIColor greenColor];

}
-(void)loadView{
    NSLog(@"loadView");

    //正确,先初始化view
    self.view=[[MyView alloc]init];

    self.view.backgroundColor=[UIColor greenColor];

}

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

推荐阅读更多精彩内容

  • 最近有一个小师弟问我生命周期和程序执行顺序的问题,话不多少,这就分享一篇文章.非常详细. 当一个视图控制器被创建,...
    炸街程序猿阅读 1,465评论 0 1
  • 由于种种原因,简书等第三方平台博客不再保证能够同步更新,欢迎移步 GitHub:https://github.co...
    萌面大道阅读 7,922评论 2 32
  • UIViewController是iOS中使用最多的类,需要了解它的生命周期以及各个阶段方法中应该做哪些事情,它的...
    brownfeng阅读 145评论 0 0
  • UIViewController的生命周期比较简单,整个流程调用代码顺序如下: initWithNibName:b...
    FlyElephant阅读 856评论 1 5
  • 对UIViewController的操作 1、创建UIViewController。 我们可以直接手写代码生成一个...
    Fiona_L阅读 225评论 0 0
  • 阅读时间:3月初 作者:郭雪波(郭尔罗斯雪波) 今天才刚读到73页,并不打算迅速读完,所以目标定在100页。这本书...
    HarbourJason阅读 106评论 0 0
  • 阴暗的天气与天空 飞起一片让人陶醉的绿色 时间与空间不断的变换 我却在盲目的穿梭 细雨如织 还有薄雾几滴 荡漾的是...
    鲍抱阅读 39评论 1 1
  • 途径: 出西安,走渭南,三门峡水流正酣。经洛阳,入豫疆。眺望郑州,换看许昌。忙,忙,忙。 漯河倦,信阳眠,多湖武汉...
    云之憾阅读 31评论 0 0
  • 最好选在春节前出发,夏装出行而且国人不太多,在这里推荐几个目的地:马来西亚(仙本那,深潜绝佳体验)泰国(清迈度假胜...
    GALEX阅读 121评论 0 2