2

似乎我的应用程序正在放弃内存,因为记录的堆的持久内存不会降至零,并且当连续重复同一组操作时堆继续增长: 在此处输入图像描述

为了找出问题,很多人建议比尔的网站对我没有用,因为我使用的是 ARC,而他指出了参考问题。然后,我关注了Apple 文档并观看了一些与 WWDC 废弃内存相关的视频。他们都说工具将有助于指出可能导致问题的代码行。因此,我查看了每个对象,但没有看到与我的代码相关的任何内容:

在此处输入图像描述

4

3 回答 3

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

我还发现了 Instruments 可以向您显示保留周期的信息(而且看起来不错)。更多详细信息如何在 ARC 下的 Instruments 中激活 Cycles 报告?但是我不知道它是否适用于 ARC,评论可能表明它不适用。作为一种繁琐的方式,我建议您注释掉一些您认为可能负责的代码,然后检查图片。


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

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

正如你所看到的,每个函数都有它对应的发布函数,通常你应该能够在文档中找到。

于 2012-11-27T09:25:10.663 回答
1

似乎使用 dSYM 文件将Build Settings\Build Options\Debug Information FormatDWARF更改为DWARF将解决问题。

在此处输入图像描述

于 2012-12-10T04:07:45.957 回答
0

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

于 2012-11-27T19:36:54.833 回答