一个vc的声明周期,通常都是先执行init初始化方法,或者自定义的init初始化方法,然后才是执行viewDidload系统方法。属性的setter方法也是在viewDidLoad之前执行,但是在写一个自定义类的时候,却发现了这样一个问题:
- (instancetype)initWithTitle:(NSString *)title {
self = [super init];
if (self) {
NSLog(@"%s", __func__);
self.view.backgroundColor = [UIColor grayColor];
_label.text = title;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
[self p_setupLabel];
}
我在viewDidLoad方法里创建了一个label,在自定义初始化方法里,给这个属性label赋值,按照VC的声明周期来说,在init方法里,给_label赋值的时候,这个label应该还是nil,因为viewDidLoad应该是在init之后执行,但是实际上label却有值。。。
打断点调试的时候,发现问题出在
self.view.backgroundColor = [UIColor grayColor];
这里,当断点走到这一步时候,下一步并不是给label赋值的代码,而是直接跳到viewDidLoad了,执行完之后,又跳回到初始化方法里,执行后面的代码。
所以说viewDidLoad方法并没有在init方法之前执行,而是执行init的过程中,调用了这个vc的属性,或者设置了它的subView,它就会立即去执行viewDidload方法。。。
在starkoverflow也有人解释了这种情况
http://stackoverflow.com/questions/31489957/viewdidload-is-called-before-whole-init-method-is-executed