我在UINavigationController中推送和弹出ViewControllers。
我正在跟踪我的应用的内存消耗。
在推送新的viewController时,内存消耗逐渐增加,但是当我使用[self.navigationController popViewControllerAnimated:NO];
弹出相同的ViewController时,内存消耗不会减少,而是常量。
用户可以多次推送和弹出特定的viewController,这会导致应用程序在RAM中的高内存消耗。
如何优化内存消耗?
答案 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保留在内存中。
检查是否存在您未释放的NSNotification观察器
在deinit方法中进行打印调用以检查其是否已释放。
要进一步了解内存管理:
答案 8 :(得分:0)
您应该使用unwind
segue来代替弹出。