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

标签 ios instruments abandoned-memory

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

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

enter image description here

最佳答案

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

简单示例:

@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,评论可能表明它不适用。作为一种麻烦的方法,我可以建议注释掉一些您认为可能负责的代码,然后检查图片。


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

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

正如您所看到的,每个函数都有其相应的释放函数,通常您应该能够在文档中找到该函数。

关于ios - 如何清除不指向自己代码的废弃内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13580883/

相关文章:

ios - 前台应用程序事件超过 100%?

iphone - UIAutomation - 仪器和命令行的不同结果

objective-c - 废弃内存和内存泄漏有什么区别?

ios - 在同一个类中调用枚举函数内部的函数

ios - 如何防止在屏幕上通知用户有关 CloudKit 的新更改?

ios - 如何将 UIGestureRecognizer 附加到 icarousel swift 代码中的项目 View

objective-c - 在哪里可以从 UIController 中找到 instantiateViewControllerWithIdentifier 的标识符?

ios - Xcode 仪器错误 : "Allocations tracking library was not loaded in time"

ios - 使用 ARC 的堆增长