为什么ARC不会在popViewController之后释放内存

时间:2014-01-28 07:02:53

标签: ios memory-management memory-leaks uinavigationcontroller

我在UINavigationController中推送和弹出ViewControllers。

我正在跟踪我的应用的内存消耗。 在推送新的viewController时,内存消耗逐渐增加,但是当我使用[self.navigationController popViewControllerAnimated:NO];弹出相同的ViewController时,内存消耗不会减少,而是常量。

用户可以多次推送和弹出特定的viewController,这会导致应用程序在RAM中的高内存消耗。

如何优化内存消耗?

9 个答案:

答案 0 :(得分:11)

当您关闭视图控制器(或弹出它)时,如果您没有向它发出任何强指针(该控制器由导航控制器或呈现视图控制器保留,那么它将被解除分配)在创建并推送或呈现它时,需要指向它的指针。

如果没有其他强烈的指针,它将被释放

答案 1 :(得分:4)

尽量避免对IBOutlets使用强大的属性。

答案 2 :(得分:3)

考虑检查您是否在块中引用self。如果这样做,您可能会在弹出UIViewController引用后保留它。

要更深入地了解原因,请查看以下答案: How do I avoid capturing self in blocks when implementing an API?

答案 3 :(得分:2)

如果您的应用程序设计允许用户反复推送和弹出相同的视图控制器,您可能希望重新使用相同的视图控制器,并在每次推送时更新其内容。

不是一遍又一遍地创建和销毁它,而是创建一个,设置其内容并推送,当它弹出时,保持它准备好再次显示。下次需要显示时,更新其内容然后再次推送。

答案 4 :(得分:2)

我想说,我过去几天用于搜索网络上的应用内存问题。我正在2个UIViewControllers之间切换。其中一个有一个滚动视图,保留所有子视图。事实证明,UIVC加载一个新的滚动视图而不释放前一个滚动视图。我花了几个小时才意识到这一点。

我做的是:

在应用程序中查找任何类型的死锁,然后搜索具有强大的atributte和其他绝望措施的每个变量。但真正奏效的是:

 @IBAction func backBB(sender: UIBarButtonItem) {
    collectionView.removeFromSuperview()
    self.frontView.removeFromSuperview()
    eventsPhotos.removeAll(keepCapacity: false)
    symbolContainerView.removeFromSuperview()
    self.myScrollView.removeFromSuperview()
    dismissViewControllerAnimated(true, completion: {})
}

我手动删除了一些视图和内容。我已经在“后退”按钮中完成了它,但是您可以在其他方法中执行此操作,例如viewWillDisappear(animated:Bool)。

一旦我做了这个,我在开发者工具中的分配图表显示内存分配上下......它已经解决了......

答案 5 :(得分:1)

当您尝试弹出视图控制器时,我认为您收到错误,因为导航控制器没有对视图控制器的有效引用,因为它是在您按下后释放的。

答案 6 :(得分:0)

没有关于解雇的人员。

[menuPopup_ dismissPopoverAnimated:YES];
menuPopup_ = nil;

答案 7 :(得分:0)

确保您的视图控制器(A)没有引用任何其他视图控制器(B)或它具有的任何对象。如果此后确保VC-B没有引用回VC-A。如果它对VC-A有一些参考,则使其成为弱项。否则,强大的保留周期即使将VC弹出也会将VC保留在内存中。

  • 另一件事是检查VC中是否有任何闭包,检查其主体是否引用了self的任何属性或方法,然后进行Capture list以避免保留循环,因为“ 闭包是引用类型
  • 检查是否存在您未释放的NSNotification观察器

  • 在deinit方法中进行打印调用以检查其是否已释放。

要进一步了解内存管理:

答案 8 :(得分:0)

您应该使用unwind segue来代替弹出。