5

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

}

为什么 ?

4

3 回答 3

9

在这种情况下,只有一种方法可以进行无限循环 - 获取视图属性,直到其未设置。如果你写下一个(例如):

- (void)loadView {
   self.view = [[UIView alloc] initWithFrame:self.view.bounds];
}

你会得到无限循环,但是

- (void)loadView {
   self.view = [[UIView alloc] initWithFrame:CGRectZero];
}

工作正常。

因此,除非您没有设置它,否则您无法访问视图属性。

于 2011-08-09T11:59:47.100 回答
4

由于您只是在继承超类(UIViewController)中正在实现的内容,因此如果您不调用超方法,那么需要完成的实现就不会完成。

几乎所有的超级方法都做一些关键的事情,继承超级类实现的本地类必须要么一起覆盖它们(除非你通过参考文档了解 super 所做的一切,这绝不是一个好主意),或者只是将本地类实现添加到继承的超类实现。

总之,每当您继承一个类时,在大多数软件开发情况下,您都应该让超类执行它的实现,除非可以安全地覆盖它们。

如果我是正确的,似乎 super loadView 实现了一些非常关键的东西来避免循环。

附加说明:但是,根据文档,您不应调用超级方法:http: //developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html 可能是原因无限循环是由于没有正确实现view属性引起的。

于 2011-01-28T07:35:52.573 回答
2

如果您覆盖 loadView,您应该为控制器的视图层次结构提供根视图。如果您不提供它,则每次引用视图时都会调用 loadView,这可能会导致无限循环。从文档:

如果手动指定视图,则必须实现 loadView 方法并使用它将根视图对象分配给视图属性。

会导致无限循环的实现:

- (void)loadView {
    NSLog(@"loadview");
}

...self.view 在 loadView 之后为零

- (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.
    }
}
于 2011-11-22T17:55:04.900 回答