如何清除不指向自己代码的废弃内存?

时间:2012-11-27 09:19:27

标签: ios instruments abandoned-memory

似乎我的应用程序正在放弃内存,因为记录的快照的持久内存不会降至零,并且当连续重复同一组操作时堆继续增长: enter image description here

为了找出问题,许多人建议Bill's site对我来说没用,因为我使用的是ARC,而他指的是参考问题。然后我跟着Apple docs观看了一些与WWDCs遗弃记忆相关的视频。他们都说仪器将有助于指出可能导致问题的代码行。所以我查看了每一个对象,但没有看到与我的代码有关的任何内容:

enter image description here

我现在卡住了,如果没有人可以提供帮助,我可能会提交应用并祈祷他们不会拒绝我的应用。 :D

感谢阅读。

3 个答案:

答案 0 :(得分:3)

我认为您需要明确查看保留周期。在层次结构中,您拥有一个具有相关对象的父对象对象,并且两者都具有强大的属性类型,它们永远不会从内存中释放。

快速举例:

@interface Parent : NSObject
@property (strong) Child *child;
@end
@interface Child : NSObject
@property (strong) Parent *parent;
@end

默认情况下,属性也很强,所以如果你根本没有声明属性,它就是一样的。

应该如此:

@interface Parent : NSObject
@property (strong) Child *child;
@end
@interface Child : NSObject
@property (weak) Parent *parent;
@end

我还发现了一些信息,仪器可以显示你保留周期(看起来不错)。更多细节How to activate Cycles reporting in Instruments under ARC?但是我不知道它是否适用于ARC,评论可能暗示它没有。作为一种繁琐的方式,我可以建议您评论一些您觉得可能有责任的代码,然后查看图片。


这就是保留周期。您应该寻找的另一件事是当您分配ARC无法返回的内存时。这些调用看起来像C函数,按照惯例在名称中有一个单词Create。每次你做这样的指针,你也应该自己清理。只是给你一些例子:

  • CGColorCreate - CGColorRelease
  • CGColorSpaceCreateWithName - CGColorSpaceRelease
  • CGBitmapContextCreate - CGContextRelease

正如您所看到的,每个函数都有相应的释放函数,通常您可以在文档中找到它。

答案 1 :(得分:1)

似乎将构建设置\构建选项\调试信息格式 DWARF 更改为使用dSYM文件的DWARF 将解决此问题。

enter image description here

答案 2 :(得分:0)

或者你正在测试Zombies开启(编辑方案 - 诊断)。如果打开僵尸,它们永远不会被删除,因此内存总是会增长。