一個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應(yīng)該還是nil缠捌,因為viewDidLoad應(yīng)該是在init之后執(zhí)行,但是實際上label卻有值译蒂。曼月。谊却。
打斷點調(diào)試的時候,發(fā)現(xiàn)問題出在
self.view.backgroundColor = [UIColor grayColor];
這里哑芹,當斷點走到這一步時候炎辨,下一步并不是給label賦值的代碼,而是直接跳到viewDidLoad了聪姿,執(zhí)行完之后碴萧,又跳回到初始化方法里,執(zhí)行后面的代碼末购。
所以說viewDidLoad方法并沒有在init方法之前執(zhí)行破喻,而是執(zhí)行init的過程中,調(diào)用了這個vc的屬性招盲,或者設(shè)置了它的subView低缩,它就會立即去執(zhí)行viewDidload方法。曹货。咆繁。
在starkoverflow也有人解釋了這種情況
http://stackoverflow.com/questions/31489957/viewdidload-is-called-before-whole-init-method-is-executed