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 不称为更改选项卡的主要内容,如果未能解决你的问题,请参考以下文章

用户登录后,使用我的个人资料选项卡动态更改登录选项卡

Xamarin 选项卡不更改数据 Android

在选项卡式应用程序中更改选项卡后运动功能不起作用

在运行时更改 TabBar 中的选项卡

在选项卡更改时动态更改 iframe 的高度?

关闭选项卡以关注上一个选项卡而不是第一个选项卡时如何更改 dojo 内容选项卡焦点?