Dealloc 不称为更改选项卡
Posted
技术标签:
【中文标题】Dealloc 不称为更改选项卡【英文标题】:Dealloc not called changing tab 【发布时间】:2013-08-29 10:25:54 【问题描述】:假设有一个标签栏控制器,有两个标签,A 和 B,其中 A 是导航控制器。
当用户在 A 中时,他可以先推 A1 再推 A2,这两个都是视图控制器。 A2 上的后退按钮,执行:
[self.navigationController popViewControllerAnimated:YES];
正确触发 A2 上的 dealloc 方法。
如果用户在A2,然后切换到标签B,我需要在A2上调用dealloc方法;因此我在 TabBarController 中实现了以下方法:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
UINavigationController *nc = (UINavigationController*)tabBarController.selectedViewController;
[nc popToRootViewControllerAnimated:YES];
return YES;
但是在这个流程中,A2 的 dealloc 方法永远不会被调用! 怎么可能从 A2 弹出到 A1 它工作,而更改选项卡视图控制器没有被释放?
感谢任何提示!
丹
【问题讨论】:
您是否尝试过使用 Instruments 来追踪对 A2 的引用? @MikePollard,我偶然发现了你的评论,这很有趣。如何使用工具追踪对 ViewController 的引用?我有类似的问题,想用你的方法。 @JFS 我会使用泄漏工具 @MikePollard 与工具我已经能够发现在我更改选项卡后 A2 的保留计数器为 1:这可能是丢失释放的原因;是否有可能知道此类保留的所有者? 如果有任何帮助,A2 会被推送到故事板中创建的 Segue;另一方面,popToRootViewController 以编程方式执行。 【参考方案1】:dealloc 仅用于删除观察者和释放内存——何时或是否调用它取决于运行时
例如 想想释放与自动释放的情况(影响何时调用)或终止应用程序(根本不调用)
而不是依赖于dealloc,写一个你显式调用的方法..例如诸如停止、完成或清理之类的事情
或者...使用 viewDidDisappear。
--无论如何,不要依赖dealloc
【讨论】:
viewDidDisappear 也没有被调用!正如你所说,我需要调用 dealloc 来移除观察者。 没有。你误解了:不要依赖于在某个时间调用 dealloc。时期。虽然没有调用 viewDidDisappear 很奇怪 是的,很奇怪,可能是tab切换时调用popToRootViewController引起的(一个vc在显示的时候不能消失)。【参考方案2】:似乎didSelectViewController
在标签控制器切换到目标标签之前被触发。
因此,popToRootViewControllerAnimated
方法的执行正确地弹出所有视图控制器,但不能真正释放可见的,因为它当前由应用程序描述。
为了实现我的结果,我想出了以下解决方案。
在每个标签的第一个视图控制器对应的所有视图控制器的viewDidAppear
方法中,我执行popToRootViewControllerAnimated
(它们都是导航控制器)。
【讨论】:
以上是关于Dealloc 不称为更改选项卡的主要内容,如果未能解决你的问题,请参考以下文章