UINavigationController pushviewcontroller内存管理

时间:2013-08-06 10:15:22

标签: ios objective-c memory-management uinavigationcontroller pushviewcontroller

我有一个UITableiew列出n个联系人,并从表视图委托didSelectRowAtIndexPath我使用 UINavigationController pushviewcontroller 导航到'Contactview'UIViewController。

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

先谢谢..

5 个答案:

答案 0 :(得分:5)

如果您前后移动导航并且看到内存无限攀爬,则会出现内存管理问题。 即使使用ARC ,您也可能放弃了内存。您可以使用Instruments中的Allocations模板检测它。

  1. 在Instruments中,将应用程序置于一个众所周知的启动状态(例如,显示表视图)。
  2. 点击“快照分析”下的标记堆按钮。
  3. 来回导航控制器一次。
  4. 您会看到分配图中的内存使用量略有增加。这是正常的,内部缓存可能存储了一些信息。
  5. 再次点击标记堆按钮。
  6. 您会在静态列中看到许多对象。
  7. 多次重复步骤3-6,并在每次迭代后查看是否存在“仍然存在”的对象。
  8. 如果每个快照中仍存在几乎恒定数量的静止物体,请单击其中一个快照中的右箭头按钮,您将看到所有仍然存在的物体。查找可能由您创建的对象,选择一个,展开它,然后通过简单的单击选择其内存地址。然后单击扩展详细信息按钮以查看显示对象分配位置的堆栈跟踪。有了这个代码上下文,我相信你会理解为什么你的记忆被抛弃了。

答案 1 :(得分:0)

请参阅..有一件事ARC将在未来的某个地方发布它的内容。它自动正确..如何能够期待ARC在课后进行Gatrbage集合将消失。它可能需要一些时间来释放内存。 / p>

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

如果您想确认是这种情况,为了安心,您可以强制执行低内存警告(在模拟器的硬件菜单下)。这应该让UIImage抛弃它的缓存。

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

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

答案 4 :(得分:0)

您可能拥有代码中其他位置的视图控制器的强引用。你应该确定它是否真的被解除分配...如果任何其他对象在导航控制器之外引用它,它将不会被释放。尝试覆盖dealloc。 (您也可以在ARC项目中覆盖dealloc,不允许使用保留计数操作调用。)为了确保调用dealloc,请将一些日志记录或某些可调试代码放入该方法中。