令我感到困惑的是,在通过我的应用程序使用乐器后,它是一个基于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?
答案 0 :(得分:3)
您可以尝试访问UINavigationController
的{{3}}属性,以获取导航堆栈中当前所有视图控制器的NSArray
。然后使用viewControllers检查视图控制器是否已经在堆栈中
如果是,则使用containsObject:显示视图控制器。如果它不在堆栈上,那么只需使用popToViewController:animated:。
如果这对您没有帮助,可能pushViewController:animated:是正确的方法。