【发布时间】: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 仍然被占用?乐器?
-
或许这篇文章可以帮到你:stackoverflow.com/questions/6881222/…
-
您是否在 viewController 之外的任何地方都持有指向滚动视图的指针?您是否调整了任何 UIScrollView 超类的 dealloc?
标签: ios objective-c uinavigationcontroller automatic-ref-counting