关于UIView 中init(包括重写) 与 viewDidLoad执行顺序问题
2015-05-05 14:51
393 查看
相信很多朋友认为,init 与viewDidLoad 的执行顺序肯定是init->viewDidLoad ,其实我认为只说对了一半。如果创建视图对象使用的是
[[MyViewController alloc] init],执行顺序确实是init->viewDidLoad,但如果我在MyViewController.m中重写了init,并且在init方法中写入了涉及视图(self.view等)属性的代码,就会在该处暂停init的执行,而去执行viewDidLoad,然后再回来执行init,(注意viewDidLoad在视图生命周期中只执行一次),所以不要再重写的init中加入视图相关代码。
如我重写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方法,而此时两个宽度属性还未初始化。
[[MyViewController alloc] init],执行顺序确实是init->viewDidLoad,但如果我在MyViewController.m中重写了init,并且在init方法中写入了涉及视图(self.view等)属性的代码,就会在该处暂停init的执行,而去执行viewDidLoad,然后再回来执行init,(注意viewDidLoad在视图生命周期中只执行一次),所以不要再重写的init中加入视图相关代码。
如我重写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方法,而此时两个宽度属性还未初始化。
相关文章推荐
- 关于viewDidLoad在[super init]之前执行的问题
- initWithNibName和viewDidLoad执行顺序
- initWithNibName与viewDidLoad的执行关系以及顺序
- initWithNibName和viewDidLoad执行顺序
- initWithNibName与viewDidLoad的执行关系以及顺序
- initWithNibName与viewDidLoad的执行关系以及顺序
- 关于重写UICollectionViewCell后的执行顺序
- initWithNibName和viewDidLoad执行顺序
- initWithNibName与viewDidLoad执行顺序
- initWithNibName与viewDidLoad的执行关系以及顺序
- cocos2d-x中CCTableView关于顺序错乱的问题
- UIView的生命周期 init、loadView、viewDidLoad、viewDidUnload、dealloc
- 关于UIAlertView 的 dismissWithClickedButtonIndex: animated: 后台执行的问题
- 关于C++输出流cout的执行顺序问题
- 关于Webview执行goBack不能返回的问题解决
- 关于verilog中initial和always过程快的执行顺序问题
- 关于新生成的物体生命周期执行顺序问题
- 嵌入式学习笔记--关于ARM中SWP指令的执行顺序问题【待验证】
- 关于 fragment重写onCreateOptionsMenu不执行问题
- UIView的一些基本方法 init、loadView、viewDidLoad、viewDidUnload、dealloc