PopViewController 正在占用内存

Posted

技术标签:

【中文标题】PopViewController 正在占用内存【英文标题】:PopViewController is holding up memory 【发布时间】:2014-03-23 17:38:13 【问题描述】:

我正在使用 ARC。我有 UINavigationController 来推送和弹出。碰巧其中一个 ViewController 是一个巨大的滚动视图,可容纳 100MB。在 popViewController 之后,应该释放包含滚动视图的 ViewController。 NSLog 显示调用了 dealloc。但是,100MB 内存仍然被占用。正常吗?

如果 viewController 的 dealloc 被调用,是否意味着它的 retainCount 已经为零并且我没有泄漏 viewController?

提前致谢

参考: Memory not released when popViewController Called APURV 建议 ios 有一种缓存机制来保持内存。 真的吗?

编辑: 从 Xcode 中的 Debug Navigator 观察到内存使用情况

编辑2:

我刚刚尝试再次运行完全相同的代码。但这一次,我打开了我的 iPhone 的个人热点,并让它不断地下载一些东西。然后我使用相同的代码再次运行该应用程序。我看到这个:

中间的尖峰是 100MB 滚动视图,现在如果我 popViewController,它会回到 12MB。这让我觉得 iOS 中确实存在缓存,并且取决于内存可用性。当内存不足时,缓存会被冲走,并且会立即释放。

我也会尝试学习 Instrument 并稍后在这里发布结果。

【问题讨论】:

您是在使用 Storyboard 来弹出您的 viewController 还是通过代码来实现? @Lapinou,我通过调用 [self.navigationController popViewControllerAnimated:YES] 弹出; 如果调用了dealloc,则意味着保留计数达到0。确实。你在哪里看到那些 100MB 仍然被占用?乐器? 或许这篇文章可以帮到你:***.com/questions/6881222/… 您是否在 viewController 之外的任何地方都持有指向滚动视图的指针?您是否调整了任何 UIScrollView 超类的 dealloc? 【参考方案1】:

保存在内存中的不一定是视图控制器本身,而是它包含的重物。

您应该查看 Instruments 以了解发生了什么。如果您使用“分配”工具并运行您的应用程序,您会在侧面看到一个“标记生成”按钮。

如果您在推入和弹出视图控制器之前和之后点击它,您应该会看到不同的“世代”以及随之而来的内存增长。扩展每一代时,它会显示哪些对象占用了该内存,每个对象旁边的小箭头会显示它们被分配的位置,并帮助您跟踪哪些引用阻止它们被释放。

【讨论】:

谢谢伙计。我以前没用过乐器,这是我学习的好机会。我会试试你的测试并告诉你结果【参考方案2】:

您的代码可能完全正确。我已经看到很多时候XCode中内存条的配置可能会产生误导,也许这就是发生在你身上。

您需要打开 Edit Scheme... 对话框并禁用当前方案配置中的 Diagnostics 下的 Enable Zombies 选项。

【讨论】:

Ar.. 值得注意的一点。但我检查了一下,并没有选择启用僵尸对象选项。不过还是谢谢。【参考方案3】:

调用 popview 控制器会从被弹出的控制器中删除导航控制器的引用。但是,如果您的视图控制器仍未释放,则意味着其他人正在持有它。

在 xcode 中使用 debug memory graph 选项,因为它显示了对内存中当前对象的传入和传出引用。您需要做的就是识别引用并使它们变弱。我不建议设置 unowned,因为这样你就必须完全确定当你使用它时该对象会存在。如此虚弱总是更安全的做法。

希望这对某人有所帮助.. !!

【讨论】:

以上是关于PopViewController 正在占用内存的主要内容,如果未能解决你的问题,请参考以下文章

popviewcontroller 没有调用 viewWillappear

Swift - 解雇后的popViewController

PopViewController 没有效果

『Python』内存分析_List对象内存占用分析

prepareForSegue 和 popViewController 的兼容性

popViewController:animated: 在 iOS 9 中不工作