如果在Xcode 4.3.2和AppDelegate.m
中使用空应用模板创建了新的iOS项目:
self.window.rootViewController = [[FooViewController alloc] init];
以及FooViewController
的{{1}},以下内容:
viewDidLoad
将打印出视图,因此看起来默认NSLog(@"self.view is %p", self.view);
NSLog(@"self.view is %@", self.view);
将实例化视图并将其分配给loadView
。
因此,如果我使用全空方法覆盖self.view
并注释掉上面的第二个loadView
语句,我希望第一个NSLog
语句打印出NSLog
,但是,由于在0x0
行的内存访问不良,应用程序崩溃了。为什么会这样?
答案 0 :(得分:5)
好吧,经过一次下意识和明显错误的回答后,我尝试了这个。 Empty App模板没有rootViewController,因此我使用了单个屏幕模板。运行后,我看到你正在堆栈溢出。在尝试访问self.view时,您正在调用超类上的view属性,然后尝试加载视图以便返回它,就我所见,它正在调用viewDidLoad等。另一个NSLog语句也是如此。
答案 1 :(得分:2)
view
property in UIViewController
州的文档:
由于访问此属性可能导致视图自动加载,因此您可以使用
isViewLoaded
方法确定视图当前是否在内存中。
它还有The View Controller Life Cycle的链接,其中指出:
加载周期中发生的步骤如下:
访问视图控制器的
view
属性并且视图当前不在内存中时,将触发加载周期。视图控制器调用其
loadView
方法。loadView
方法的默认实现可以执行以下两项操作之一:
如果视图控制器与故事板相关联,则会从故事板中加载视图。
如果视图控制器未与故事板关联,则会创建一个空的
UIView
对象并将其分配给view
属性。- 醇>
视图控制器调用其
viewDidLoad
方法以允许您的子类执行任何其他加载时任务。
所以当你说:
所以如果我用全空方法覆盖
loadView
你故意打破生命周期,因为当你的被覆盖的loadView
版本完成时,它应该已经加载了一个视图。因为它没有,你会崩溃。