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

看起来,我的应用程序正在放弃内存,因为logging的堆栈的持久内存不会降为零,并且在连续重复同一组操作时堆堆将继续增长: 在这里输入图像说明

为了找出问题所在,很多人build议比尔的网站对我来说是无用的,因为我使用的是ARC,而他指的是参考性的问题。 然后,我跟着苹果文档 ,观看了一些关于WWDC遗弃内存的video。 他们都表示,仪器将有助于指向可能导致问题的代码行。 所以我回顾了每一个对象,但没有看到任何与我的代码有关的东西:

在这里输入图像说明

我现在卡住了,如果没有人能帮忙,我可能会提交应用程序,并祈祷他们不会拒绝我的应用程序。 :d

谢谢阅读。

我认为你需要明确的保留周期。 当层次结构中有一个拥有相关对象的父对象对象,它们都具有强types的属性时,它们将永远不会从内存中释放。

快速示例:

@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 

我还发现仪器可以显示你保留周期(它看起来不错)的信息。 更多详情如何激活ARC下仪器的周期报告? 但是,我不知道它是否适用于ARC,评论可能表明它没有。 作为一个麻烦的方式,我可以推荐评论一些你觉得可能是负责任的代码,然后检查图片。


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

  • CGColorCreate – CGColorRelease
  • CGColorSpaceCreateWithName – CGColorSpaceRelease
  • CGBitmapContextCreate – CGContextRelease

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

看来, 使用dSYM FileBuild Settings \ Build Options \ Debug信息格式DWARF更改为DWARF将解决此问题。

在这里输入图像说明

或者你正在testing僵尸打开(编辑计划 – 诊断)。 如果僵尸开启,他们永远不会被删除,因此内存总是增长。

Interesting Posts