viewDidload方法在init初始化方法之前執(zhí)行

一個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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 官方文檔 初始化 Initialization是為準備使用類,結構體或者枚舉實例的一個過程。這個過程涉及了在實例里...
    hrscy閱讀 1,148評論 0 1
  • 初始化 (Initialization) 自從蘋果2014年發(fā)布Swift,到現(xiàn)在已經兩年多了,而Swift也來到...
    Lebron_James閱讀 1,222評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • 初始化(Initialization) 初始化是類、結構體、枚舉類型的準備過程。這個過程涉及到所有存儲屬性的初始化...
    泗哥閱讀 5,653評論 0 3
  • 駕……駕……駕…… 啪……啪……啪…… 遠方傳來男人的聲音和鞭子抽打馬匹的聲音,越來越近了。 路的中央躺著許多的尸...
    火上冰凌亙古今閱讀 274評論 0 2