UINavigationController策略(iPhone)

UINavigationController策略(iPhone),iphone,memory-management,uinavigationcontroller,Iphone,Memory Management,Uinavigationcontroller,有些事情让我困惑,在用仪器浏览了我的应用程序后,它是一个基于UINavigation的应用程序,它注意到了这一点 每次点击tableView单元格时,我都会执行以下操作: GenericTableViewController *someViewController = [[Generic TableViewController alloc] init]; [self.navigationController pushViewController:someV

有些事情让我困惑,在用仪器浏览了我的应用程序后,它是一个基于UINavigation的应用程序,它注意到了这一点

每次点击tableView单元格时,我都会执行以下操作:

        GenericTableViewController *someViewController = [[Generic TableViewController alloc] init];    
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
然后我点击后退按钮,查看仪器中存在多少GenericTableViewController的活动实例。在后轻触之前有1,之后有0。 这是由UINavigationController进行的非常好的干净内存管理

但是,在应用程序中的其他地方,我不使用“后退”按钮离开视图,在某些viewController中,点击我的自定义按钮之一将运行与上述完全相同的代码,但点击自定义按钮的viewController将不会被释放

我想我理解为什么navigationController会做出判断调用,我可能会将某些内容推送到堆栈中,稍后会返回,因此它会将控制器保留在内存中。这意味着点击后退按钮将使用
[self.navigationController popViewController]
。嗯

现在的问题是,每次我使用导航栏中的“后退”按钮访问未保留的视图时,它都会 不会被释放。每次我访问一个视图时,仪器中的计数分配都会增加,直到我有大约20个对象

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

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

是否有合理的方式告诉UINavigationController:如果此viewController位于堆栈上,请显示它,如果不在,请实例化它,推到堆栈并显示它

这里的挑战可能是,在NavigationController中并非所有的导航都是完全线性的。我有时不得不从第2项到第5项,再回到第3项等等


那么有没有办法做到这一点,在仍然使用UINavigationController时,请确保释放我的viewController,并且不要多次实例化同一个viewController?

您可以尝试访问
UINavigationController
的属性,以获取导航堆栈上当前所有视图控制器的
NSArray
。然后使用检查视图控制器是否已在堆栈上。
如果是,则使用显示视图控制器。如果它不在堆栈上,那么就使用它。
如果这对您没有帮助,可能是正确的方法。

Hi ChrisB我没有考虑使用ViewController数组手动测试我的对象是否在堆栈上。正确实施我应该能够尽可能少地进行此测试。谢谢