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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官方文档 初始化 Initialization是为准备使用类,结构体或者枚举实例的一个过程。这个过程涉及了在实例里...
    hrscy阅读 1,154评论 0 1
  • 初始化 (Initialization) 自从苹果2014年发布Swift,到现在已经两年多了,而Swift也来到...
    Lebron_James阅读 1,234评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,119评论 19 139
  • 初始化(Initialization) 初始化是类、结构体、枚举类型的准备过程。这个过程涉及到所有存储属性的初始化...
    泗哥阅读 5,660评论 0 3
  • 驾……驾……驾…… 啪……啪……啪…… 远方传来男人的声音和鞭子抽打马匹的声音,越来越近了。 路的中央躺着许多的尸...
    火上冰凌亘古今阅读 277评论 0 2