【问题标题】:How to clear abandoned memory that doesn't point to own code?如何清除不指向自己代码的废弃内存?
【发布时间】:2012-11-14 21:01:51
【问题描述】:

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

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

【问题讨论】:

  • 最好重新检查您的代码以找出内存泄漏发生在哪里。

标签: ios instruments abandoned-memory


【解决方案1】:

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

快速示例:

@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 可以向您显示保留周期的信息(而且看起来不错)。更多细节在这里How to activate Cycles reporting in Instruments under ARC? 但是我不知道它是否适用于 ARC,cmets 可能会建议它不适用。作为一种繁琐的方式,我建议您注释掉一些您认为可能负责的代码,然后检查图片。


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

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

如你所见,每个函数都有对应的发布函数,通常你应该可以在文档中找到。

【讨论】:

  • 感谢ride.inc,我在我的应用程序中发现了 1 个保留周期。修复后,堆增长减少了一点,不是全部。是否还有其他可能导致问题的原因?
  • 当然,我刚刚用 Create() 函数更新了答案,这些函数应该在发布之后发布,也许你有一些。
  • 我没有使用这个功能,尝试在我的项目中使用'Create'关键字搜索,但什么也看不到
  • 那么也许你可以尝试“递归地”注释掉代码片段。就像首先注释掉几乎所有的代码,然后如果你运行并测试应用程序,它显然应该可以正常工作。然后只启用一小段代码,检查,启用另一个模块/行,检查。这应该或多或少地指向负责的地方。如果您提供该信息,那么我可以进一步帮助您。
【解决方案2】:

似乎将 Build Settings\Build Options\Debug Information Format 从 DWARF 更改为 DWARF with dSYM File 可以解决问题。

【讨论】:

  • 除了标题,我认为这不是很清楚这是你的问题,而且所有答案似乎都试图回答如何解决内存问题,而不是关于(重新)符号化问题...
  • 更改此设置后,仪器工具指向我自己的代码。所以我可以找到根本原因。
  • 使用 dSYM 文件将 Build Settings\Build Options\Debug Information Format 从 DWARF 更改为 DWARF 时,dsym 文件会丢失吗?并且崩溃文件不能转换为人类文件?
【解决方案3】:

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

【讨论】:

  • 谢谢 ahwulf,我确实检查了 Diagnostics/Objective-C - Enable Zombie Objects 未选中。所以,这可能不是原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2012-02-29
  • 2014-02-01
相关资源
最近更新 更多