相信不少朋友認爲,init 與viewDidLoad 的執行順序確定是init->viewDidLoad ,其實我認爲只說對了一半。若是建立視圖對象使用的是spa
[[MyViewController alloc] init],執行順序確實是init->viewDidLoad,但若是我在MyViewController.m中重寫了init,而且在init方法中寫入了涉及視圖(self.view等)屬性的代碼,就會在該處暫停init的執行,而去執行viewDidLoad,而後再回來執行init,(注意viewDidLoad在視圖生命週期中只執行一次),因此不要再重寫的init中加入視圖相關代碼。對象
如我重寫init的代碼爲:生命週期
-(instancetype)initit
{class
self=[super init];程序
if (self) {方法
NSLog(@"init1");view
self.view.backgroundColor=[UIColor whiteColor];vi
NSLog(@"init2");初學者
}
return self;
}
viewDidLoad代碼以下
- (void)viewDidLoad
{
NSLog(@"viewDidLoad");
}
那麼在執行 [[MyViewController alloc] init]的時候,就會在控制檯出現這樣的輸出:
init1
viewDidLoad
init2
去掉init中的 self.view.backgroundColor=[UIColor whiteColor];這句話,輸出結果爲:
init1
init2
viewDidLoad
所以,viewDidLoad方法彷佛存在一種懶加載機制,具體並無深刻研究,但把涉及視圖的代碼寫入init中進行初始化是不少初學者很差的習慣,因此init中一半寫對象一些屬性初始化,最好別洗有關視圖的屬性。由於若是這樣寫:
-(instancetype)init
{
self=[super init];
if (self) {
self.view.backgroundColor=[UIColor whiteColor];
_buttonWidth=100.0f;
_buttonHeight=50.0f;
}
return self;
}
- (void)viewDidLoad
{
UIButton *button=[[UIButton alloc]init];
button.frame=CGRectMake(0,200,_buttonWidth,_buttonHeight);
button.backgroundColor=[UIColor redColor];
[self.view addSubView:button];
}
運行後,按鈕將沒法顯示,由於程序在運行到init的self.view.backgroundColor=[UIColor whiteColor]時已經執行了viewDidLoad方法,而此時兩個寬度屬性還未初始化。