UINavigationController pushview控制器内存管理



我有一个UITableView,列出了n个联系人,从表视图委托didSelecRowAtIndexPath,我正在使用UINavigationController pushviewcontroller导航到"Contactview"UIViewController。

例如,如果我将第一个联系人导航到Contactview,Live Bytes内存将从1 MB增加到3 MB。然后,当我点击后退按钮时,会调用viewcontrollerdelloc方法,但内存仍保持在2.95MB到3MB左右。我的问题是,当调用viewcontrollerdelloc方法时,应该释放viewcontroller的内存,对吗?我哪里错了吗?如果我错了,请建议我。我正在使用ARC项目。

提前感谢。。

如果你来回推动导航,你看到内存无限攀升,那么你就有内存管理问题了即使使用ARC,您也可能会放弃内存。您可以使用Instruments中的Allocations模板来检测它。

  1. 在Instruments中,将应用程序置于众所周知的启动状态(例如,显示表格视图)
  2. 单击"堆快照分析"下的"标记堆"按钮
  3. 来回导航控制器一次
  4. 您将在分配图中看到内存使用量的小幅增加。这是正常的,内部缓存可能正在存储一些信息
  5. 再次单击标记堆按钮
  6. 您将在Still Live列中看到许多对象
  7. 多次重复步骤3-6,看看每次迭代后是否有"仍然存在"的对象

如果每个堆快照中有几乎恒定数量的静止对象,请单击其中一个堆快照中的右箭头按钮,您将看到所有仍在活动的对象。查找可能由您创建的对象,选择一个,展开它,然后单击即可选择其内存地址。然后单击Extended Detail按钮,查看显示对象分配位置的堆栈跟踪。有了这个代码上下文,我相信你会理解为什么你的记忆被抛弃了。

请参阅。。有一件事ARC会在未来的某个地方发布它的内容。它是自动的权利。。怎么能指望ARC在下课后做Gatrbage集合呢。释放内存可能需要时间。

您检查retainCount了吗?这显示了你想要的价值吗?

UIImage为您缓存图像作为优化,因此这是预期行为。

如果您想确认情况确实如此,为了让您放心,您可以强制发出内存不足警告(在模拟器的硬件菜单下)。这应该会让UIImage抛出其缓存。

您也可以使用这个私有方法,但在提交之前当然要将其丢弃。

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];

您可能在代码的其他地方拥有视图控制器的强引用。你应该确定它是否真的被释放了。。。如果任何其他对象在导航控制器之外有对它的引用,它将不会被释放。尝试覆盖解除锁定。(您也可以在ARC项目中重写dealloc,只是不允许使用保留计数操作调用。

最新更新