2012-04-02 97 views
1

我的根viewController的方法viewWillDisappear, viewWillUnload viewDidUnload永远不会被调用(每个都有日志语句)。在这里看起来像这样,但答案并不完全清楚。这似乎意味着viewController视图需要嵌入UINavigationController这看起来很奇怪,而不是我在其他地方看到的东西。viewWillDisappear,viewWillUnload viewDidUnload永远不会调用

viewWillDisappear and viewDidDisappear never get called

如果是这样的话,我还有什么地方可以做一些清理工作,并确保我的UIDocument变化得救?

编辑:猜我误解@根viewController事件如何工作(它是独特的状态等)。将研究AppDelegate方法。只是试图确保我的UIDocument的东西得到保存,而且我的核心音频的东西正确关闭。

Close: 结束了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]; 

回答

3

如果这是你的根视图,你永远不会改变它 - 那么它不会消失。尽管viewWillDisapear可能会在你将应用程序放到后台时调用,但我不记得了。

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

viewWillDisappear:

这种方法被称为响应于视图被从视图层次结构中移除。在实际删除视图之前以及配置任何动画之前调用此方法。

viewDidUnload:

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

+0

doh!这就说得通了。我正在模拟器中测试,并期待看到这些视图事件被触发。看起来像AppDelegate是处理我的清理的正确位置。 – 2012-04-02 14:08:26

0

释放不必要的缓存或资源的典型地点是- (void)didReceiveMemoryWarning。如果您在此方法中没有这样做,iOS可能会选择在低内存时终止您的应用。

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

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

相关问题