//------------------ <#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:]