【问题标题】:Custom UIViewController viewDidUnload never gets called自定义 UIViewController viewDidUnload 永远不会被调用
【发布时间】:2012-04-18 06:18:37
【问题描述】:

我有一个自定义 UIViewController 子类,它自己处理所有视图初始化(它不使用 nib)。还有另一个从 nib 加载的 UIViewController 子类。两者都包含在 UITabBarController 中。 当内存警告出现时,第一个控制器会收到通知,但不会调用 viewDidUnload。第二个控制器也收到通知,它的 viewDidUnload 确实被调用了。 我签入了 didReceiveMemoryWarning,self.isViewLoaded 为 TRUE,self.view.superview 为空。 在通知出现时,两个控制器(它们的选项卡)都是不可见的。

由于内存警告,自定义视图控制器是否应该执行一些特殊操作才能卸载?

【问题讨论】:

  • AFAIK,这完全取决于操作系统。

标签: ios cocoa uiviewcontroller


【解决方案1】:

如果您要继承 UIViewContoller 并且没有从 NIB 初始化它,则需要继承 -loadView 方法。否则 iOS 假定视图不能被卸载/重新加载。

只需将以下内容添加到您的实现中就足够了:

- (void)loadView {
    [super loadView];
}

我将尝试为此查找文档报价。

The documentation is unfortunately not very clear on this matter.

【讨论】:

  • 不应在自定义loadView方法中调用[super loadView]。如下代码: self.view = [[[UIView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame]autorelease]; // 这是苹果在上面引用的文档中指出的
  • 这不是自定义加载方法,而是简单的实现让Framework知道这个视图可以重新创建。
【解决方案2】:

我会查看有关视图控制器生命周期的文档。具体来说,查看收到内存警告时会发生什么的部分。如果您的自定义视图控制器的视图是屏幕上的视图,则操作系统不会尝试释放此视图。当您收到内存警告时,屏幕上是否显示此视图?在模拟器中,导航到 nib-loaded 视图并模拟内存警告,然后查看您的自定义视图是否被释放。另外,查看是否正在调用 viewWillUnload。并确保在您要覆盖的任何这些方法中调用 super。

【讨论】:

  • 他确实说过“在通知出现时,两个控制器(它们的选项卡)都是不可见的。”这就是让这个问题变得有趣的原因......
  • 好吧,这不是最清楚的问题。我可以在标签栏控制器中有一个视图控制器并隐藏标签栏。对我来说,这与说“隐藏标签”相同。当然,我的标签是隐藏的,但我的视图仍在屏幕上。标签栏控制器只是控制器的一个控制器。
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多