IOS - ViewController的LoadView跟ViewDidLoad方法相关知识总结

IOS -- ViewController的LoadView和ViewDidLoad方法相关知识总结
    最近几天一直在纠结,ViewController的LoadView和ViewDidLoad方法的
  • 分别什么时候会调用呢?又是谁调用的它们?
  • 分别做什么?

    不开源,大神和网上资料一大堆却又各说纷纭,越搅越糊,但一经常被我骚扰的大神给我一张图,认真看看后连蒙带猜写了这么几行代码,几番测试,终于云淡雾轻,拨云见日了。先上测试代码:

@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的设计者不把这两个方法整一起的用意是什么


最后奉上一张图,嘎嘎,就是那位老被我骚扰的耐心大神送的,请大家对我吐口水。。

IOS - ViewController的LoadView跟ViewDidLoad方法相关知识总结