1

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

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

提前致谢..

4

5 回答 5

5

如果你来回推动你的导航并且你看到内存无限制地攀升,那么你有一个内存管理问题。即使使用 ARC,您也可能已经放弃了记忆。您可以使用 Instruments 中的分配模板来检测它。

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

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

于 2013-08-06T11:01:56.443 回答
0

看..一件事ARC会在未来的某个地方释放它的内容。它的自动权利..怎么能指望ARC在课后进行垃圾收集将消失。释放内存可能需要时间。

于 2013-08-06T10:20:47.610 回答
0

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

于 2013-08-06T10:24:28.967 回答
0

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

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

你也可以使用这个私有方法,但是当然在提交之前把它扔掉。

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
于 2013-08-06T10:29:18.727 回答
0

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

于 2013-08-06T10:41:44.743 回答