2

如果在 Xcode 4.3.2 中使用 Empty App 模板创建新的 iOS 项目,并且在AppDelegate.m

self.window.rootViewController = [[FooViewController alloc] init];

FooViewController'sviewDidLoad中,如下:

NSLog(@"self.view is %p", self.view);
NSLog(@"self.view is %@", self.view);

将打印出视图,因此看起来默认loadView会实例化一个视图并将其分配给self.view.

因此,如果我loadView用一个全空的方法覆盖,并注释掉NSLog上面的第二个语句,我希望第一个NSLog语句打印出来0x0,但是由于该NSLog行的内存访问权限错误,应用程序崩溃了。为什么会这样?

4

2 回答 2

5

好的,在一个下意识的和明显错误的答案之后,我尝试了这个。Empty App 模板没有 rootViewController,所以我使用了单个屏幕模板。运行后,我看到您遇到了堆栈溢出。在尝试访问 self.view 时,您正在调用超类上的 view 属性,然后它会尝试加载视图以返回它,这正在调用 viewDidLoad 等,据我所知。另一个 NSLog 语句也是如此。

于 2012-05-24T19:58:08.013 回答
2

各州view财产UIViewController的文件:

因为访问该属性会导致视图被自动加载,所以可以使用该isViewLoaded方法来判断视图当前是否在内存中。

它还有一个指向View Controller Life Cycle的链接,其中指出:

在加载周期中发生的步骤如下:

  1. view访问视图控制器的属性并且视图当前不在内存中时,将触发加载循环。

  2. 视图控制器调用它的loadView方法。该loadView方法的默认实现执行以下两件事之一:

    • 如果视图控制器与情节提要相关联,它会从情节提要中加载视图。

    • 如果视图控制器未与情节提要相关联,UIView则会创建一个空对象并将其分配给该view属性。

  3. 视图控制器调用它的viewDidLoad方法来允许你的子类执行任何额外的加载时任务。

所以当你说:

所以如果我loadView用一个全空的方法覆盖

您故意破坏生命周期,因为当您的覆盖版本loadView完成时,它应该已经加载了一个视图。因为它没有,所以你会崩溃。

于 2012-05-24T20:08:41.767 回答