【问题标题】:Why my UIViewController's view is being unloaded when visible?为什么我的 UIViewController 视图在可见时被卸载?
【发布时间】:2012-07-31 06:47:55
【问题描述】:

这个问题从来没有发生在我身上。我在 UINavigationController 中有一个 UIViewController。当收到内存警告时(不管级别),visible 控制器的viewDidUnload 方法被调用,所以视图被卸载,我得到一个很棒的黑屏(导航栏在顶部)。

我在 iOS 4.3.3 上使用 iPad 1 进行测试。

有什么建议吗?

【问题讨论】:

  • 当您收到此警告时,导航控制器的“views”属性是什么样的(即其中有什么、顺序等)?此外,在您的 viewDidUnload 中,添加日志 NSLog(@"WINDOW: %@", self.view.window)" - 这将告诉您该视图是否可见。
  • 这是“真实”警告还是您模拟的警告?
  • 大卫,它是真的。
  • 你在打电话[super viewDidUnload]; ?
  • 仅在您的子视图控制器上,不在导航控制器上?

标签: ios memory memory-management uiviewcontroller viewdidunload


【解决方案1】:

据我了解,viewDidUnload 方法由UIViewController(超类)中的didRecieveMemoryWarning 函数调用。基本上,iOS 会给你一些警告,并希望看到你的内存使用量下降。如果您继续忽略这些,操作系统将杀死您的应用程序。

但有时,保持某些视图正常运行至关重要,因此我解决此问题的方法是简单地覆盖 didRecieveMemoryWarning 方法并在其中不做任何事情。

或者更好的是,检查self 是否是self.navigationController.visibleViewController 中的当前视图,如果是,则不要将内存警告调用传递给[super didRecieveMemoryWarning]

如果您持有图像缓存或其他东西,只需清空它们即可。

HTH

【讨论】:

  • 快速注意,iOS6 现在已经改变了这种行为。 UIViewController 默认不再自动调用viewDidUnload 的内存警告。它只是调用didReceiveMemoryWarning 方法,仅此而已。仅限 iOS6。
【解决方案2】:

根据Apple内存管理指南,当viewcontroller在紧急情况下收到内存警告时,它会直接调用viewDidUnload,以便通过释放视图来管理内存。

它实际上是 ios 提供了清除临时数据的机会,这在重新创建视图时会很有用。由于您的UIViewCotrollernavigationcontroller 的根viewcontroller,您会看到导航栏视图被卸载。

【讨论】:

  • @emenegro 参见link,“了解视图如何加载和卸载”部分 bold 图 4-2 bold 显示了视图是如何加载和卸载的ViewController收到内存警告时卸载。上图也有解释。
  • 我很久以前看过这些文档,但在任何地方都看不到可以卸载可见视图的异常情况。这些文档解释了如何卸载视图,以及卸载周期步骤中的 C&P:“如果无法安全释放视图(例如,它在屏幕上可见)......”。所以我想知道是否有可能在可见时卸载视图,在这种情况下是在导航堆栈内。
【解决方案3】:

您在控制器上的内存不足的情况下收到 viewDidUnload,此时 iOS 已确定不再需要视图。请记住,Apple 在更高版本的 iOS 上对实现进行了一些改进,因此看到 5.x 下发生的情况可能会更糟。其次,您应该检查您的视图控制器层次结构。

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 2011-02-27
    • 2012-05-11
    • 1970-01-01
    • 2016-11-14
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多