我正在使用UINavigationController
构建应用。我有ViewController
显示一些内容,当它收到用户的互动(例如点击按钮)时,会显示一个新的ViewController
。
以下是代码:
FirstViewController.m
-(IBAction)goToSecondVC:(id)sender{
SecondViewController *secondVC = [[SecondViewController alloc] init];
[self.navigationController pushViewController: secondVC];
}
我想在FirstViewController
出现后从内存中释放SecondViewController
。然后,例如,如果我从SecondViewController
跳到FifthViewController
我也希望SecondViewController
被释放。
当我在控制器之间来回跳转时,应用程序消耗的内存会增加,这意味着它们不会被释放。有什么想法吗?
当我在控制器之间切换时,这是内存指示器发生的情况。 ARC已激活:
答案 0 :(得分:1)
UINavigationController
使用堆栈数据结构管理viewControllers
,因此您有2个操作:Pop
和Push
。 firstVC
--push-> secondVC
--push-> thirdVC
。现在第一,第二和第三将留在记忆中更快弹出。如果您认为这会消耗大量内存,而不是使用viewController
的其他演示文稿,例如以模态方式呈现它,或将其添加为chiled viewController,然后手动将其删除,但使用UINavigationController
,只有pop操作才能确保释放viewController(如果没有其他强引用)。
答案 1 :(得分:0)
没有。您不想发布这些视图控制器。它们是导航堆栈的一部分并保留在内存中,因此可以快速导航回来。如果您的应用程序使用了太多内存,您需要找到其他地方以消耗更少的内存,或者您需要使用除导航控制器之外的其他内容。
答案 2 :(得分:0)
前一个答案是正确的,你应该避免这样的逻辑。
但有一个技巧可以做这些事情。 您可以在navigationController上设置-setViewControllers,并仅粘贴那些您希望保留在堆栈中的vc。
对于前。要释放FirstViewController,您可以调用Second(在viewDidAppear上为ex。)
NSArray *viewControllers = @[self];
self.navigationController.viewControllers = viewControllers;
答案 3 :(得分:0)
你不能这样做。因为导航控制器在从中推出时保持所有视图控制器。当你尝试弹出时,它会释放它。在您尝试手动释放它之前。它会崩溃。如果在导航过程中异常增加内存,请使用instrument
和找出泄漏并进行修复。