【问题标题】:Releasing ViewControllers form memory inside a UINavigationController在 UINavigationController 中释放 ViewController 形成内存
【发布时间】:2014-03-13 11:32:22
【问题描述】:

我正在使用UINavigationController 构建一个应用程序。我有一个显示一些内容的ViewController,当它接收到来自用户的交互(例如点击一个按钮)时,会显示一个新的ViewController

代码如下:

FirstViewController.m

-(IBAction)goToSecondVC:(id)sender{  
    SecondViewController *secondVC = [[SecondViewController alloc] init];
    [self.navigationController pushViewController: secondVC];    
}

一旦SecondViewController 出现,我想从内存中释放FirstViewController。然后例如,如果我从SecondViewController 跳到FifthViewController,我希望SecondViewController 也能被释放。 当我在控制器之间来回跳转时,应用程序消耗的内存会增加,这意味着它们没有被释放。有什么想法吗?

当我在控制器之间切换时,内存指示器会发生这种情况。 ARC被激活:

【问题讨论】:

    标签: ios objective-c memory uinavigationcontroller


    【解决方案1】:

    UINavigationController使用栈数据结构来管理viewControllers,所以你有2个操作:PopPushfirstVC --push-> secondVC --push-> thirdVC。现在第一、第二和第三个将保留在内存中以便更快地弹出。如果您认为这会消耗大量内存,那么您可以为您的viewController 使用其他演示文稿,例如以模态方式演示它,或者将其添加为 chiled viewController 然后手动删除它,但使用UINavigationController,只有弹出操作将确保 viewController 将被释放(如果上面没有其他强引用)。

    【讨论】:

      【解决方案2】:

      没有。你不想释放这些视图控制器。它们是导航堆栈的一部分并保留在内存中,因此可以快速导航回它们。如果您的应用使用的内存过多,您需要寻找其他地方消耗更少的内存,或者您需要使用导航控制器以外的其他东西。

      【讨论】:

      • 你会用什么来代替UINavigationController?我要使用的逻辑如下: 1-我加载一个 VC 2-我跳转到另一个 VC 并释放第一个。 3-如果我想回到第一个 VC,我创建它的一个新实例并跳转到它。
      • 为什么从内存中释放视图控制器如此重要?我了解您希望获得良好的性能,但视图控制器不应该占用大量内存,并且您可能通过不必在每次需要呈现视图控制器时都实例化视图控制器的新实例而获得更好的整体性能。
      • 每个ViewController 都包含大量的多媒体内容,这些内容会增加内存消耗。
      【解决方案3】:

      前面的答案是正确的,你应该避免这样的逻辑。

      但是做这些事情是有技巧的。 您可以在您的 navigationController 上 -setViewControllers 并只粘贴您想要留在堆栈中的那些 vc。

      例如。要释放 FirstViewController,您可以调用 Second(例如在 viewDidAppear 上)

      NSArray *viewControllers = @[self];
      self.navigationController.viewControllers = viewControllers;
      

      【讨论】:

      • 现在,您肯定在浪费内存,因为您有一个无法导航的导航控制器。
      • 当然。正如我之前所说 - 你应该避免这种逻辑。
      • 是的,如果您确实需要从 navigationController 中删除 VC 并将其从内存中释放,则此方法有效。使用 navigationController?.viewControllers.removeObject(_:) 删除 vc 将创建一个保留周期并导致内存未安全释放。
      【解决方案4】:

      你不能这样做。因为导航控制器在从它推送时持有所有视图控制器。当您尝试弹出时,它会释放它。在您尝试手动释放它之前。它会崩溃。如果在导航过程中异常增加内存,请使用instrument找出漏洞并修复它。

      【讨论】:

      • 这里可能没有任何泄漏。这是完全正常的预期 UINavigationController 行为。
      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 2018-09-25
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 2018-12-09
      • 2015-01-31
      • 2017-02-01
      相关资源
      最近更新 更多