一個vc的聲明周期,通常都是先執(zhí)行init初始化方法,或者自定義的init初始化方法,然后才是執(zhí)行viewDidload系統(tǒng)方法。屬性的setter方法也是在viewDidLoad之前執(zhí)行,但是在寫一個自定義類的時候,卻發(fā)現(xiàn)了這樣一個問題:
- (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方法里創(chuàng)建了一個label,在自定義初始化方法里,給這個屬性label賦值,按照VC的聲明周期來說,在init方法里,給_label賦值的時候,這個label應該還是nil,因為viewDidLoad應該是在init之后執(zhí)行,但是實際上label卻有值。。。
打斷點調試的時候,發(fā)現(xiàn)問題出在
self.view.backgroundColor = [UIColor grayColor];
這里,當斷點走到這一步時候,下一步并不是給label賦值的代碼,而是直接跳到viewDidLoad了,執(zhí)行完之后,又跳回到初始化方法里,執(zhí)行后面的代碼。
所以說viewDidLoad方法并沒有在init方法之前執(zhí)行,而是執(zhí)行init的過程中,調用了這個vc的屬性,或者設置了它的subView,它就會立即去執(zhí)行viewDidload方法。。。
在starkoverflow也有人解釋了這種情況
http://stackoverflow.com/questions/31489957/viewdidload-is-called-before-whole-init-method-is-executed