使用loadView时无限循环

时间:2011-01-28 06:51:06

标签: ios loadview

在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");

}

为什么?

3 个答案:

答案 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.
    }
}