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

本文详细解析了iOS开发中ViewController类中的loadView和viewDidLoad方法的调用时机、作用及如何正确使用它们。通过代码示例,阐述了方法间的区别与联系,并讨论了如何优化初始化流程。
  • 分别什么时候会调用呢?又是谁调用的它们?
  • 分别做什么?

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

[cpp]  view plain copy
  1. <span style="font-size:14px">@implementation YTFViewController  
  2.   
  3. -(void)loadView{  
  4.     NSLog(@"loadView");  
  5. }  
  6.   
  7. - (void)viewDidLoad  
  8. {  
  9.     [super viewDidLoad];  
  10.     UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];  
  11.     [self.view addSubview:button];   
  12.       
  13. }</span>  

     在[self.view addSubview:button]; 行打断点,测试结果:先打印了,进入viewDidLoad()执行到断点行,便进入loadView执行打印,且死循环,再次进入viewDidLoad();于是将测试代码修改为:


[cpp]  view plain copy
  1. <span style="font-size:14px">@implementation YTFViewController  
  2.   
  3. -(void)loadView{  
  4.     NSLog(@"loadView");  
  5. }  
  6.   
  7. - (void)viewDidLoad  
  8. {  
  9.     [super viewDidLoad];  
  10.     [self view];  
  11.       
  12. }  
  13. @end</span>  

    结果依旧。由此可见,因为复写的loadView()没有对vc的view进行赋值,其值为nil,而self.view中应该是有这么些语句

[cpp]  view plain copy
  1. <span style="font-size:14px">if(_view==nil) {  
  2. .....  
  3. [self loadView];  
  4. [self ViewDidLoad];  
  5. ....  
  6. }</span>  

综上可以得出结论,以回答第一个问题: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的设计者不把这两个方法整一起的用意是什么


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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值