iOS应用框架

viewDidload方法在init初始化方法之前执行

2017-01-09  本文已影响201人  leejnull

一个vc的声明周期,通常都是先执行init初始化方法,或者自定义的init初始化方法,然后才是执行viewDidload系统方法。属性的setter方法也是在viewDidLoad之前执行,但是在写一个自定义类的时候,却发现了这样一个问题:

-  (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方法里创建了一个label,在自定义初始化方法里,给这个属性label赋值,按照VC的声明周期来说,在init方法里,给_label赋值的时候,这个label应该还是nil,因为viewDidLoad应该是在init之后执行,但是实际上label却有值。。。
打断点调试的时候,发现问题出在
self.view.backgroundColor = [UIColor grayColor];
这里,当断点走到这一步时候,下一步并不是给label赋值的代码,而是直接跳到viewDidLoad了,执行完之后,又跳回到初始化方法里,执行后面的代码。

所以说viewDidLoad方法并没有在init方法之前执行,而是执行init的过程中,调用了这个vc的属性,或者设置了它的subView,它就会立即去执行viewDidload方法。。。

在starkoverflow也有人解释了这种情况
http://stackoverflow.com/questions/31489957/viewdidload-is-called-before-whole-init-method-is-executed

上一篇下一篇

猜你喜欢

热点阅读