viewWillDisappear, viewWillUnload viewDidUnload 从未调用

Posted

技术标签:

【中文标题】viewWillDisappear, viewWillUnload viewDidUnload 从未调用【英文标题】:viewWillDisappear, viewWillUnload viewDidUnload never called 【发布时间】:2012-04-02 13:50:52 【问题描述】:

我的根 viewController viewWillDisappear, viewWillUnload viewDidUnload 上的方法永远不会被调用(每个都有日志语句)。

似乎在此之前已经出现过这种情况,但答案并不完全清楚。这似乎暗示需要将 viewController 视图嵌入到 UINavigationController 中,这看起来很奇怪,而且我在其他任何地方都没有提到过。

viewWillDisappear and viewDidDisappear never get called

如果是这种情况,我还能在哪里进行清理并确保我的 UIDocument 更改得到保存?

编辑:我猜我误解了 @ 根 viewController 事件的工作方式(它是唯一状态等)。将研究 AppDelegate 方法。只是想确保我的 UIDocument 内容得到保存,并且我的 Core Audio 内容正确关闭。

关闭: 最终得到了 AppDelegate 发布的通知。执行一次后似乎效果很好+简单的东西。

// 来自 appDelegate

- (void)applicationDidEnterBackground:(UIApplication *)application


[[NSNotificationCenter defaultCenter] postNotificationName: @"handleCleanup" 
                                                    object: nil 
                                                  userInfo: nil];

和我的 VC 注册通知:

    [[NSNotificationCenter defaultCenter] addObserver: self 
                                         selector: @selector(saveAndCleanup) 
                                             name: @"handleCleanup" 
                                           object: nil];

【问题讨论】:

【参考方案1】:

如果它是您的根视图,并且您从不更改它 - 那么它就不会消失。虽然当您将应用置于后台时可能会调用 viewWillDisapear - 我不记得了。

只有当您收到内存警告时,您的视图控制器才会被卸载,但如果它在屏幕上 - 它不会被卸载。

viewWillDisappear:

调用此方法以响应从视图层次结构中删除的视图。在实际移除视图和配置任何动画之前调用此方法。

viewDidUnload:

当内存不足且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。此方法在视图控制器的视图被释放后调用,这是您执行任何最终清理的机会。如果您的视图控制器存储了对视图或其子视图的单独引用,您应该使用此方法来释放这些引用。您还可以使用此方法删除对您为支持视图而创建但在视图消失后不再需要的任何对象的引用。您不应使用此方法发布用户数据或任何其他无法轻松重新创建的信息。

【讨论】:

哇!这就说得通了。我正在模拟器中进行测试,并希望看到这些视图事件被触发。似乎 AppDelegate 是处理我的清理工作的正确位置。【参考方案2】:

释放不必要的缓存或资源的典型位置是- (void)didReceiveMemoryWarning。如果您没有在此方法中执行此操作,ios 可能会选择在内存不足时终止您的应用。

考虑到移动应用的性质,您应该尽可能多地保存。典型的实现使用定时器来发出自动保存。有时有来电,iOS 可能会选择杀死您的应用,而不是将其置于后台,因为您正在使用大量内存。

另一方面,当- (void)didReceiveMemoryWarning 被调用时,你的视图肯定会被卸载。但是,这并不意味着该应用程序将被杀死。这意味着下次打开应用程序时,将再次调用viewDidLoad。从这个意义上说,你可以尝试用这种方法保存文件。

【讨论】:

以上是关于viewWillDisappear, viewWillUnload viewDidUnload 从未调用的主要内容,如果未能解决你的问题,请参考以下文章

viewWillDisappear, viewWillUnload viewDidUnload 从未调用

动画 viewWillAppear 和 viewWillDisappear?

为啥 UIActivityViewController 会在 Presenter 上调用 viewWillDisappear()?

为啥 setViewControllers 不会触发 viewWillDisappear 和 dealloc?

viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 指南

InputAccessoryView 的 viewWillDisappear:iOS 9 早期调用的方法