- 分别什么时候会调用呢?又是谁调用的它们?
- 分别做什么?
不开源,大神和网上资料一大堆却又各说纷纭,越搅越糊,但一经常被我骚扰的大神给我一张图,认真看看后连蒙带猜写了这么几行代码,几番测试,终于云淡雾轻,拨云见日了。先上测试代码:
- <span style="font-size:14px">@implementation YTFViewController
- -(void)loadView{
- NSLog(@"loadView");
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
- [self.view addSubview:button];
- }</span>
在[self.view addSubview:button]; 行打断点,测试结果:先打印了,进入viewDidLoad()执行到断点行,便进入loadView执行打印,且死循环,再次进入viewDidLoad();于是将测试代码修改为:
- <span style="font-size:14px">@implementation YTFViewController
- -(void)loadView{
- NSLog(@"loadView");
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- [self view];
- }
- @end</span>
结果依旧。由此可见,因为复写的loadView()没有对vc的view进行赋值,其值为nil,而self.view中应该是有这么些语句
- <span style="font-size:14px">if(_view==nil) {
- .....
- [self loadView];
- [self ViewDidLoad];
- ....
- }</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的设计者不把这两个方法整一起的用意是什么
最后奉上一张图,嘎嘎,就是那位老被我骚扰的耐心大神送的,请大家对我吐口水。。
本文详细解析了iOS开发中ViewController类中的loadView和viewDidLoad方法的调用时机、作用及如何正确使用它们。通过代码示例,阐述了方法间的区别与联系,并讨论了如何优化初始化流程。
1803

被折叠的 条评论
为什么被折叠?



