在UIViewController中使用loadView时非常有趣的问题。
通常我们这样使用
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
NSLog(@"loadview");
[super loadView];
}
如果删除
[super loadView];
我们将使用此
进行死循环- (void)loadView {
NSLog(@"loadview");
}
为什么?
答案 0 :(得分:9)
在这种情况下,只有一种方法可以实现无限循环 - 获取视图属性直到未设置。如果你写下(例如):
- (void)loadView {
self.view = [[UIView alloc] initWithFrame:self.view.bounds];
}
你将获得无限循环,但
- (void)loadView {
self.view = [[UIView alloc] initWithFrame:CGRectZero];
}
工作正常。
因此,在未设置之前,您无法访问视图属性。
答案 1 :(得分:4)
由于你只是在继承超类(UIViewController)中实现的内容,如果你不调用超级方法,那么就不需要进行实现。
几乎所有超级方法都做了一些关键的事情,继承超类实现的本地类必须一起覆盖它们(除非你通过引用文档知道关于超级做什么的一切,它从来不是一个好主意),或者只是ADD本地继承超类实现的类实现。
总之,无论何时继承一个类,在大多数软件开发的情况下,都应该让超类执行它的实现,除非可以安全地覆盖它们。
如果我是正确的,似乎超级loadView实现了一些非常关键的东西来避免循环。
附加说明:
但是,根据文档,您不应调用超级方法:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html
可能是无限循环的原因是由于没有适当地实现view
属性。
答案 2 :(得分:2)
如果覆盖loadView,则需要为控制器的视图层次结构提供根视图。如果你不提供它,每次引用视图时都会调用loadView,这可能会导致无限循环。来自文档:
如果手动指定视图,则必须实现loadView方法并使用它将根视图对象分配给视图属性。
会导致无限循环的实现:
- (void)loadView {
NSLog(@"loadview");
}
...在loadView
之后,self.view为零- (void)loadView {
self.view; // Or anything that references self.view
}
...引用self.view会导致调用loadView,因此是一个无限循环。
正确:
- (void)loadView {
self.view = [[UIView alloc] init];
if (self.view == nil) {
[super loadView]; // Try to load from NIB and fail properly, also avoiding inf. loop.
}
}