码迷,mamicode.com
首页 > 其他好文 > 详细

关于UIView 中init(包括重写) 与 viewDidLoad执行顺序问题

时间:2015-05-05 15:49:59      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

         相信很多朋友认为,init 与viewDidLoad 的执行顺序肯定是init->viewDidLoad ,其实我认为只说对了一半。如果创建视图对象使用的是

[[MyViewController alloc] init],执行顺序确实是init->viewDidLoad,但如果我在MyViewController.m中重写了init,并且在init方法中写入了涉及视图(self.view等)属性的代码,如我重写init的代码为:

-(instancetype)init

{

    self=[super init];

    if (self) {

  NSLog(@"init1");

   self.view.backgroundColor=[UIColor whiteColor];

  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方法,而此时两个宽度属性还未初始化。

 

关于UIView 中init(包括重写) 与 viewDidLoad执行顺序问题

标签:

原文地址:http://www.cnblogs.com/iosliu/p/4479134.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!