为什么在popViewController之后ARC没有释放内存

我在UINavigationController中推送和popupViewControllers。

我正在跟踪我的应用程序的内存消耗。 虽然推新viewController内存消耗逐渐增加,但是当我popup相同的ViewController使用[self.navigationController popViewControllerAnimated:NO]; 内存消耗不减less,但不变。

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

我应该怎么做来优化我的内存消耗?

当你closures视图控制器(或者popup视图控制器)时,如果你没有强制指向视图控制器(这个控制器由导航控制器或者视图控制器保存,那么它将被解除分配,所以你通常不需要当你创build并推送或呈现它时,有一个指向它的指针)。

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

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

考虑检查你是否在块中引用self 。 如果你这样做,你popup它之后,你有冒险保留在UIViewController引用。

有关更深入的回顾,请查看以下答案: 如何在执行API时避免以块forms捕获自己?

如果您的应用程序devise允许用户反复推送和popup相同的视图控制器,则可能需要考虑重复使用相同的视图控制器,并在每次推送时更新其内容。

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

我想说,我的最后几天花在search我的应用程序内存问题的networking上。 我在2个UIViewControllers之间切换。 其中一个有一个滚动视图,它保留了所有的子视图。 事实certificate,UIVC加载一个新的滚动视图,而不会释放前一个。 我花了几个小时才意识到这一点。

我做的是:

寻找应用程序内的任何forms的死锁,然后search每个具有强大的分支和其他绝望措施的variables。 但真正有效的是:

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

我手动删除了一些意见和内容。 我已经在“后退”button中完成了这个工作,但是您可以使用其他方法(如viewWillDisappear(animated:Bool))来执行此操作。

一旦我做到这一点,我在开发人员仪器中的分配图表显示内存分配上升和下降…它解决了…

我想你会得到一个错误,当你试图popup视图控制器,因为导航控制器没有一个有效的视图控制器的引用,因为它被推后它被释放。

没有解雇的popover。

 [menuPopup_ dismissPopoverAnimated:YES]; menuPopup_ = nil;