iOS开发之UIView与UIViewController的生命周期总结

//------------------ <#UIViewController的生命周期总结#> ----------//

@loadView
@viewDidLoad
@viewWillAppare
@viewWillLayoutSubviews
@ viewDidLayoutSubviews:已经布局完成子视图。
@ viewDidAppare:视图完成显示时调用。
@ viewWillDisappare:视图将要消失时调用。
@ viewDidDisappare:视图已经消失时调用。
@ dealloc:controller被释放时调用。

//--------------------------- <#UIView的生命周期总结#> ------------------------------//
如果纯代码创建UIView,调用方式为YFView *yfView = [[YFView alloc]init];那么它的生命周期为:

-[YFView init]
-[YFView initWithFrame:]
-[YFView layoutSubviews]
drawRect

如果纯代码创建UIView,调用方式为YFView *yfView = [[YFView alloc]initWithFrame:[UIScreen mainScreen].bounds];那么它的生命周期为:

-[YFView initWithFrame:]
-[YFView layoutSubviews]
drawRect

如果通过XIB创建UIView,调用方式为NSArray *array = [[NSBundle mainBundle]loadNibNamed:@"YFView" owner:nil options:nil];[array lastObject];那么它的生命周期为:

//--------------------------- <#XIB创建UIView#> ------------------------------//

-[YFView initWithCoder:]
-[YFView awakeFromNib]
-[YFView layoutSubviews]
drawRect

//--------------------------- <#解释验证#> ------------------------------//
//--------------------------- <#解释验证#> ------------------------------//
//--------------------------- <#解释验证#> ------------------------------//

- (void)drawRect:(CGRect)rect {
    // Drawing code
    [super drawRect:rect];

}

- (instancetype)init{
    if (self = [super init]) {
        
    }
    return self;
}

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

- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        
    }
    return self;
}
- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
}
- (void)layoutSubviews{
    [super layoutSubviews];
    
}

@ initialize函数并不会每次创建对象都调用,只有在这个类第一次创建对象时才会调用,做一些类的准备工作,再次创建这个类的对象,initalize方法将不会被调用,对于这个类的子类,如果实现了initialize方法,在这个子类第一次创建对象时会调用自己的initalize方法,之后不会调用,如果没有实现,那么它的父类将替它再次调用一下自己的initialize方法,以后创建也都不会再调用。因此,如果我们有一些和这个相关的全局变量,可以在这里进行初始化。

@ init方法和initCoder方法相似,只是被调用的环境不一样,如果用代码进行初始化,会调用init,从nib文件或者归档进行初始化,会调用initCoder。

@ loadView方法是开始加载视图的起始方法,除非手动调用,否则在ViewController的生命周期中没特殊情况只会被调用一次。

@ viewDidLoad方法是我们最常用的方法的,类中成员对象和变量的初始化我们都会放在这个方法中,在类创建后,无论视图的展现或消失,这个方法也是只会在将要布局时调用一次。

@ viewWillAppare:视图将要展现时会调用。

@ viewWillLayoutSubviews:在viewWillAppare后调用,将要对子视图进行布局。

@ viewDidLayoutSubviews:已经布局完成子视图。

@ viewDidAppare:视图完成显示时调用。

@ viewWillDisappare:视图将要消失时调用。

@ viewDidDisappare:视图已经消失时调用。

@ dealloc:controller被释放时调用。

如果控制器是直接通过代码创建出来的,并且调用方法为[[YFViewController alloc]init]创建VC的生命周期为:

-[YFViewController initWithNibName:bundle:]
-[YFViewController init]
-[YFViewController loadView]
-[YFViewController viewDidLoad]
-[YFViewController viewDidAppear:]
如果创建控制器时勾选了XIB,那么调用方法为[[YFViewController alloc]init]创建VC时的生命周期为:

-[YFViewController initWithNibName:bundle:]
-[YFViewController init]
-[YFViewController loadView]
-[YFViewController viewDidLoad]
-[YFViewController viewDidAppear:]
如果是通过SB创建控制器,那么VC的生命周期为:

-[ViewController initWithCoder:]
-[ViewController awakeFromNib]
-[ViewController loadView]
-[ViewController viewDidLoad]
-[ViewController viewDidAppear:]

你可能感兴趣的:(iOS开发之UIView与UIViewController的生命周期总结)