没有 xib 文件的 alloc/init 初始化视图控制器不调用 viewDidUnload

Posted

技术标签:

【中文标题】没有 xib 文件的 alloc/init 初始化视图控制器不调用 viewDidUnload【英文标题】:viewDidUnload not called for alloc/init initialized viewcontroller with no xib file 【发布时间】:2012-06-15 12:10:21 【问题描述】:

当我通过模拟器模拟任何 ios 版本的内存警告时,为什么不调用 viewDidUnload 方法?似乎从未调用过此方法。

如果我通过 alloc/initWithNibName 使用 xib 文件创建控制器,则成功调用 viewDidUnload 方法。 为什么会这样?所有视图控制器是否都需要 xib 文件才能正常处理内存警告?

【问题讨论】:

【参考方案1】:

viewDidUnload 会在收到内存警告时调用,并为每个具有不可见视图的视图控制器调用它,例如 UINavigationController 如果您推送新视图控制器并且此视图控制器会导致内存不足呈现视图控制器viewDidUnload 将被调用(因为它的视图不可见)

另请注意,如果您实现 didReceiveMemoryWarning 并且不调用 [super didReceiveMemoryWarning];,则您的 viewDidUnload 不会被调用

例如,如果你的视图控制器中有这个

- (void)didReceiveMemoryWarning

    //with 
    [super didReceiveMemoryWarning]; // viewDidUnload gets called

    //without [super didReceiveMemoryWarning]; viewDidUnload does not get called

【讨论】:

我没有覆盖 didReceiveMemoryWarning 方法并且 viewDidUnload 仍然没有被调用。 您想要接收 viewDidUnload 的视图控制器在屏幕上是否仍然可见?如果是,那么它不会收到它 确保它在屏幕上不可见,我从这个控制器中弹出【参考方案2】:

我解决了我的问题。 我没有xib的实现只需要添加这段代码:

- (void) loadView 
   UIView * myView = [[[UIView alloc] init] autorelease];
   self.view = myView;

【讨论】:

【参考方案3】:

受测试计划条款的限制,我认为我们无法详细讨论 iOS 6 Beta,但我也可能建议您在第 8 页 iOS 6 中查看第 6 页底部关于 viewWillUnload 和 viewDidUnLoad 的 Beta 1 发行说明。

【讨论】:

以上是关于没有 xib 文件的 alloc/init 初始化视图控制器不调用 viewDidUnload的主要内容,如果未能解决你的问题,请参考以下文章

NSString 初始化对象有几种方法

UIImagePickerController 在调用 alloc init 时真的很慢

如何以编程方式从课堂加载故事板?

使用alloc后如何初始化UIButton的类型?

即使在 [[UIPickerView alloc] init] 之后设置了委托,也没有调用 UIPickerView 委托方法

内存管理