美文网首页iOS应用框架
viewDidload方法在init初始化方法之前执行

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

作者: leejnull | 来源:发表于2017-01-09 17:03 被阅读201次

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

    相关文章

      网友评论

        本文标题:viewDidload方法在init初始化方法之前执行

        本文链接:https://www.haomeiwen.com/subject/esjhbttx.html