6

在基于标签栏的应用程序中,如果我从一个选项卡中将一个控制器推入导航堆栈中,然后当另一个选项卡处于活动状态时,我尝试弹出该控制器,除非在没有动画的情况下弹出该控制器,否则它不会被释放。UIKit不释放控制器,如果它没有被动画删除?

这工作:

[navigationController popToRootViewControllerAnimated:NO]; 

这并不:

[navigationController popToRootViewControllerAnimated:YES]; 

没有人有这里发生了什么的任何想法? animated参数使用不当吗?

UPDATE:

苹果告诉我,这确实是UIKit中的错误,他们将其标记为紧急,并指派某人吧。它可能已在最新版本中得到解决,但我没有时间检查。

+1

听起来像是UIKit中的错误。如果您可以通过简单的项目进行确认,请将其提交给Apple。 – 2010-07-16 12:42:22

+0

我刚刚创建了一个示例项目来确认它,我可以这么做。当然,这不是每次使用UINavigationController都会发生的事情。如果在一个选项卡内有一个带有导航控制器的UITabBarController,并且从另一个选项卡弹出导航控制器,则会发生这种情况。我注意到,如果堆栈中有多个视图控制器,除最后一个之外,它们都会被释放,直到您选择返回另一个选项卡(带有导航控制器的那个)时才会保留。 – eugeniodepalo 2010-07-16 14:30:19

+1

如果用“last”控制器表示根控制器,那么这是相关的:“如果堆栈顶部的视图控制器是根视图控制器,这个方法什么都不做......你不能弹出最后一个项目堆栈“。 (来自'popViewControllerAnimated:'的文档)。你很少必须担心UIKit何时发布对象。只要确保你做了你的内存管理的一部分。谁知道,也许框架会保留一个对象来回收它?或者可能不是。关键是,你可以依靠它们进行充分测试。 – Felixyz 2010-07-17 00:58:01

回答

0

什么Dshutsi建议是正确的。如果您想要删除通知,最好在控制器的viewDidUnload方法中调用。当控制器从堆栈卸载时调用此方法。我只是引用了这个,因为我们不能评论这个评论作为答案。

+0

在文档中写道,viewDidUnload仅在内存不足的情况下被调用。我想这不是这种情况。尽管这不是我寻找的答案(控制器*应该被释放),但我会接受它,因为除了向动画参数传递YES以外,它是唯一的工作解决方案!谢谢。 – eugeniodepalo 2010-07-23 13:35:19

0

如果主要问题是观察到的通知,为什么不在“ - (void)viewWillDisappear:(BOOL)animated” - 方法中删除观察者?

+0

因为我仍然希望在控制器处于隐藏状态时收到通知(例如用户选择另一个选项卡)。我认为viewWillDisappear:每次控制器没有显示在屏幕上时都会调用,不是吗? – eugeniodepalo 2010-07-19 15:07:16

+0

您可以尝试viewDidUnload方法,该方法在视图从其控制器释放时应该被调用。 查看以下文档:http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW36 – Dshutsi 2010-07-20 08:23:08

相关问题