0

我正在使用 Profile 来查找任何内存泄漏。

我发现了 2 个有趣的漏洞,我无法理解:

Leaked Object |  Responsible Library | Responsible Frame

ALAsset         AssetsLibrary         [ALAssetsGroup _enumerateAssetsAtIndexes:options:usingBlock:]_block_invoke_0125

ALAssetPrivate  AssetsLibrary        -[ALAsset initWithManagedAsset:library:]

是我的问题还是 AssetsLibrary?有什么想法可以解决这个问题吗?

4

2 回答 2

1

是我的问题还是 AssetsLibrary?有什么想法可以解决这个问题吗?

很可能泄漏是由您自己的代码引起的。责任框架显示的事实ALAsset仅意味着内存是在该库中分配的。但是,如果您是该内存的所有者,则您应对泄漏负责。

至于如何解决,首先尝试一下Xcode中的静态分析器。这有时会有所帮助。

如果没有,请查看您如何使用 AssetsLibrary 或您用来访问它的任何中间框架。检查所有属性,以及对 alloc/init 或便利构造函数的每次调用。

如果您不知道可能在哪里产生泄漏,一个有用的技术是有选择地注释掉代码块(当然,您应该以一种明智的方式这样做,以便应用程序可以运行而不会崩溃)并再次检查 Instruments直到泄漏消失(在这种情况下,您知道是什么原因造成的)。

于 2013-01-23T11:43:41.240 回答
1

问题在于资产库本身。它包含内存泄漏。有证据表明,以下代码已经在分析器中显示了泄漏(请注意,我注释掉了将资产添加到可变数组的行):

[assetGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {         
        if(result == nil) {
            *stop = YES;
        } else {
            //[theAssets addObject:result];
        }
}];

一个可能的解决方法是检查 ALAsset 指针的保留计数,如果保留计数 > 1(如果您自己没有保留它,它应该在块末尾为 1)。

编辑:

我注意到泄漏实际上是一个被 ALAsset 过度保留的 ALAssetPrivate 对象,ALAsset 实例的保留计数是正确的。

编辑:

愚蠢的我,内存泄漏实际上是由我在 ALAsset 上实现的一个类别引起的,其中包括一个自身的 dealloc 方法。这就是泄漏的原因。

于 2013-05-27T10:13:49.410 回答