關於UIView 中init(包括重寫) 與 viewDidLoad執行順序問題

         相信不少朋友認爲,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方法,而此時兩個寬度屬性還未初始化。

相關文章
相關標籤/搜索