0

假设有一个标签栏控制器,有两个标签,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 工作,而更改选项卡视图控制器没有被释放?

感谢您的任何提示!

4

2 回答 2

1

dealloc 仅用于删除观察者和释放内存——何时或是否调用它取决于运行时

例如
考虑释放与自动释放的情况(影响何时调用)或者如果您终止应用程序(根本不调用)

而不是依靠dealloc,写一个你明确调用的方法..例如停止或完成或清理

或... 使用 viewDidDisappear。

-- 无论如何,不​​要依赖 dealloc

于 2013-09-01T15:44:46.327 回答
0

似乎didSelectViewController在选项卡控制器切换到目标选项卡之前触发。因此,该方法的执行popToRootViewControllerAnimated正确地弹出所有视图控制器,但不能真正释放可见的,因为它当前由应用程序描述。

为了达到我的结果,我想出了以下解决方案。在viewDidAppear每个选项卡的第一个视图控制器对应的所有视图控制器的方法中,我执行popToRootViewControllerAnimated(它们都是导航控制器)。

于 2013-09-01T15:37:59.647 回答