【发布时间】:2011-01-23 04:01:19
【问题描述】:
有些事情让我感到困惑,在使用仪器浏览我的应用程序后,它是一个基于 UINavigation 的应用程序,它注意到了这一点。
每次点击 tableView 单元格时,我都会这样做:
GenericTableViewController *someViewController = [[Generic TableViewController alloc] init];
[self.navigationController pushViewController:someViewController animated:YES];
[someViewController release];
然后我点击返回按钮并查看 Instruments 以查看存在多少 GenericTableViewController 的活动实例。后抽头前有 1,后抽头后有 0。 这是由 UINavigationController 进行的出色、良好的干净内存管理。
但是,应用程序中的其他地方我不使用后退按钮离开视图,在某些视图控制器中,点击我的自定义按钮之一将完全像上面一样运行代码,但是我点击自定义的视图控制器按钮,不会被释放。
我想我明白为什么,navigationController 会做出判断调用,我可能会将某些东西压入堆栈并且稍后会返回,因此它将控制器保留在其内存中。这一定意味着点击后退按钮使用[self.navigationController popViewController]。好的。
现在的问题是,每次我使用导航栏中的“后退”按钮访问未离开的视图时,它 不会被释放。每次我访问一个视图时,Instruments 中的计数分配都会增加,直到我有 20 个对象存在。
我尝试将[self.navigationController popViewController] 放在我的自定义按钮的选择器中。这意味着我在将新的视图控制器推入堆栈之前手动弹出可见视图控制器。
但是分配计数不下来?猜猜“返回”按钮毕竟没有使用这种技术......
我也尝试过使用 popToViewController,因为我总是知道控制器是否在堆栈上。但是要使用 popToViewController,我需要为视图保留一个参考。
有什么好办法对 UINavigationController 说:如果这个 viewController 在你的堆栈上,请显示它,如果没有,请实例化它,压入堆栈并显示它。
这里的挑战可能是并非我在 NavigationController 中的所有导航都是完全线性的。我有时不得不从堆栈项目编号开始。 2 堆叠项目编号。 5,回到3等等。
那么有没有办法做到这一点,同时仍然让 UINavigationController 确保释放我的 viewController 并且不多次实例化同一个 viewController?
【问题讨论】:
标签: iphone memory-management uinavigationcontroller