viewWillDisappear,viewWillUnload从未调用viewDidUnload

时间:2012-04-02 13:50:53

标签: ios uiview uiviewcontroller

我的根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];

2 个答案:

答案 0 :(得分:3)

如果这是你的根视图,而你永远不会改变它 - 那么它就不会消失。虽然,当您将应用程序置于后台时,viewWillDisapear可能会被调用 - 我不记得了。

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

viewWillDisappear:

  

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

viewDidUnload:

  

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

答案 1 :(得分:0)

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

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

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