IOS - ViewController的LoadView跟ViewDidLoad方法相关知识总结
IOS -- ViewController的LoadView和ViewDidLoad方法相关知识总结
最近几天一直在纠结,ViewController的LoadView和ViewDidLoad方法的
在[self.view addSubview:button]; 行打断点,测试结果:先打印了,进入viewDidLoad()执行到断点行,便进入loadView执行打印,且死循环,再次进入viewDidLoad();于是将测试代码修改为:
结果依旧。由此可见,因为复写的loadView()没有对vc的view进行赋值,其值为nil,而self.view中应该是有这么些语句
- 分别什么时候会调用呢?又是谁调用的它们?
- 分别做什么?
不开源,大神和网上资料一大堆却又各说纷纭,越搅越糊,但一经常被我骚扰的大神给我一张图,认真看看后连蒙带猜写了这么几行代码,几番测试,终于云淡雾轻,拨云见日了。先上测试代码:
@implementation YTFViewController
-(void)loadView{
NSLog(@"loadView");
}
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[self.view addSubview:button];
}
在[self.view addSubview:button]; 行打断点,测试结果:先打印了,进入viewDidLoad()执行到断点行,便进入loadView执行打印,且死循环,再次进入viewDidLoad();于是将测试代码修改为:
@implementation YTFViewController
-(void)loadView{
NSLog(@"loadView");
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self view];
}
@end
结果依旧。由此可见,因为复写的loadView()没有对vc的view进行赋值,其值为nil,而self.view中应该是有这么些语句
if(_view==nil) {
.....
[self loadView];
[self ViewDidLoad];
....
}
综上可以得出结论,以回答第一个问题:ViewController的LoadView和ViewDidLoad方法分别什么时候会调用呢?又是谁调用的它们?
- 在vc初始化时(此处不明确是否是init()里调用,所以没有具体那个或者哪些方法而是用“初始化”这么抽象的描述。。),会调用loadView(),然后执行ViewDidLoad(),因为复写的loadView中并没有调用ViewDidLoad,但其确实被调用了,所以确定其不是在viewLoad中调用。
- 当执行[self view]时,如果view==nil(view为null,相信主要就是viewDidUnLoad()的[supper viewDidUnLoad]将其赋值为nil),则调用loadView及ViewDidLoad;
- 其他我还不知道的时候有地方调用,希望各位大神不吝赐教,回帖补充。
至于他们supper分别做了什么,我们又应该在里面干点什么呢?
loadView():
- 其[supper loadView]会根据是否有xil以生成view对象,没有则new一个UIView对象给view,也就是说loadView中会生成View对象
- 假如我们要复写loadView,给view赋一个我们自定义的view,就不要调用[supper loadView]了,大神们都说这样做会影响性能,但没解释为什么会降低性能,我想因为[supper loadView]在这种应用场景下调用就是一行多余的代码,因为你自定义的View最终会替代[supper loadView]所创建的view。
viewDidLoad():
- 其[supper]真不知道干了什么,赶脚好像撒都没干
- 通常我们对view的进一步初始化会写在这里面,比如加个button什么的。。
- ?这是我想问的问题,就我所见的,这两个方法都是对view进行初始化且都会一起被调用,loadView貌似也就是给view创建了对象,cooca的设计者不把这两个方法整一起的用意是什么
最后奉上一张图,嘎嘎,就是那位老被我骚扰的耐心大神送的,请大家对我吐口水。。