我正在使用ARC。我有UINavigationController来推送和弹出。碰巧其中一个ViewController是一个巨大的滚动视图,可以容纳100MB。在popViewController之后,包含scrollview的ViewController应该会释放。 NSLog显示调用了dealloc。但是,100MB内存仍然被占用。这是正常的吗?
如果调用了viewController的dealloc,是否意味着它的retainCount已经为Zero并且我没有泄漏viewController?
提前致谢
价: Memory not released when popViewController Called APURV建议iOS有一个缓存机制来保存内存。 真的吗?
编辑: 从Xcode中的Debug Navigator中观察到内存使用情况
EDIT2:
我刚尝试再次运行完全相同的代码。但这一次,我有我的iPhone的个人热点,并让它连续下载。然后我用相同的代码再次运行应用程序。我看到了这个:
中间的尖峰是100MB滚动视图,现在如果我是popViewController,它会回到12MB。这让我觉得iOS中真的有一个缓存,取决于内存的可用性。当内存不足时,缓存将被冲走,同时,释放将立即发生。
我还将尝试学习仪器并在以后发布结果。
答案 0 :(得分:4)
它不一定是视图控制器本身保存在内存中,而是它包含的重物。
你应该看一下仪器,找出正在发生的事情。如果您使用"分配"仪器,并运行您的应用程序,您将看到一个" Mark Generation"旁边的按钮。
如果你在推入和弹出视图控制器之前和之后点击它,你应该看到不同的"几代"以及随之而来的记忆增长。展开每一代时,它会显示哪些对象正在占用该内存,并且每个对象旁边的小箭头将显示它们的分配位置,并帮助您跟踪哪些引用使它们不被释放。
答案 1 :(得分:2)
您的代码可能完全正确。我已经看过很多次XCode内存条的配置可能会产生误导,也许会发生这种情况。
您需要打开编辑方案... 对话框,并在诊断下的当前方案配置中禁用启用僵尸选项。
答案 2 :(得分:0)
调用popview controller会从正在弹出的控制器中删除navigationcontroller的引用。但是,如果您的View Controller仍然没有释放,则意味着有人在握住它。
在xcode中使用debug memory graph选项,因为它显示了内存中当前对象的传入和传出引用。您需要做的就是识别参考并使它们变弱。我不建议将其设为无主,因为这样一来,您必须完全确保在使用该对象时该对象将存在。如此虚弱总是一种较安全的做法。
希望这对某人有帮助。!!