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