UINavigationController策略(iPhone)

时间:2010-03-03 11:32:04

标签: iphone memory-management uinavigationcontroller

令我感到困惑的是,在通过我的应用程序使用乐器后,它是一个基于UINavigationBased的应用程序,它注意到了这一点。

每次点击一个tableView单元格,我都会这样做:

        GenericTableViewController *someViewController = [[Generic TableViewController alloc] init];    
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];

然后点击后退按钮,查看Instruments,查看GenericTableViewController存在多少个实例。后方点击前有1个,之后有0个。 这是UINavigationController的优秀,干净的内存管理。

然而,应用程序中的其他地方我没有使用后退按钮留下视图,在一些viewControllers中点击我的一个自定义按钮将完全像上面那样运行代码,但是viewController,我在其中点击了自定义按钮,不会被释放。

我想我明白为什么,navigationController会做出一个判断调用,我可能会把东西推到堆栈上,然后我会返回,所以它会把控制器保留在内存中。这必须意味着点按后退按钮会使用[self.navigationController popViewController]。确定。

现在的问题是每次我访问一个未使用navigationBar中的“后退”按钮而留下的视图时,它 不会被释放。每次访问视图时,仪器中的计数分配都会增加,直到我有20个物体存在。

我尝试在我的自定义按钮的选择器中放置一个[self.navigationController popViewController]。这意味着我在将新的打开到堆栈之前手动弹出可见的viewController。 但分配数量不会下降?猜测“后退”按钮毕竟不使用这种技术......

我也尝试过使用popToViewController,因为我总是知道控制器是否已经在堆栈中。但是要使用popToViewController,我需要为视图保留一个引用。

是否有一些合理的方式向UINavigationController说:如果这个viewController在你的堆栈上,请显示它,如果不是,请实例化它,推送到堆栈并显示它。

这里的挑战可能不是我在NavigationController中的所有导航都是完全线性的。我有时候不得不从堆栈项目开始。 2堆叠项目号。 5,回到3等。

有没有办法做到这一点,同时仍然让UINavigationController确保释放我的viewControllers而不是多次实例化相同的viewController?

1 个答案:

答案 0 :(得分:3)

您可以尝试访问UINavigationController的{​​{3}}属性,以获取导航堆栈中当前所有视图控制器的NSArray。然后使用viewControllers检查视图控制器是否已经在堆栈中 如果是,则使用containsObject:显示视图控制器。如果它不在堆栈上,那么只需使用popToViewController:animated:。 如果这对您没有帮助,可能pushViewController:animated:是正确的方法。