我用的是ARC。我有UINavigationController要推送和弹出。碰巧的是,其中一个ViewController是一个巨大的滚动视图,可以支持100MB。在popViewController之后,包含滚动视图的ViewController应该被释放。NSLog显示调用了dealloc。但是,100MB内存仍被占用。正常吗?
如果调用viewController的dealloc,是否意味着它的retainCount已经为零,并且我没有泄漏viewController?
提前感谢
Ref:Memory not released when popViewController Called APURV建议有一种iOS的缓存机制来保持内存。这是真的吗?
编辑:在Xcode中从调试导航器中观察到内存使用情况

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

中间的峰值是100MB的滚动视图,现在如果我使用popViewController,它又回到了12MB。这让我认为在iOS中确实存在缓存,并且依赖于内存可用性。当它超出内存时,缓存将被冲走,同时,释放也将立即发生。
稍后,我还会尝试在这里学习如何测量和发布结果。
发布于 2014-03-24 01:51:31
保存在内存中的不一定是视图控制器本身,而是它包含的大量对象。
你应该看看Instruments,看看到底是怎么回事。如果你使用“分配”工具,并运行你的应用程序,你会在边上看到一个"Mark Generation“按钮。

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

发布于 2014-03-24 02:01:33
你的代码可能是完全正确的。我已经看到很多次XCode中内存条的配置可能会产生误导,也许这就是发生在你身上的事情。
您需要打开编辑方案...对话框,并禁用当前方案配置中诊断下的Enable Zombies选项。

发布于 2018-10-11 23:02:02
如果你的视图控制器仍然没有被释放,那么调用popview控制器将从popped.However控制器中移除导航控制器的引用,这意味着其他人正在持有它。
在xcode中使用debug memory graph选项,因为它显示了对内存中当前存在的对象的传入和传出引用。您所需要做的就是识别引用并使其变弱。我不建议将其设为无主,因为这样你就必须完全确定当你使用该对象时,该对象将会出现。所以弱化总是一种更安全的做法。
希望这能帮助到一些人..!!
https://stackoverflow.com/questions/22594518
复制相似问题