泄露的对象:ALasset和ALAssetPrivate

时间:2013-01-23 11:35:40

标签: ios objective-c memory-leaks alasset assetslibrary

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

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

Leaked Object |  Responsible Library | Responsible Frame

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

ALAssetPrivate  AssetsLibrary        -[ALAsset initWithManagedAsset:library:]

是我的问题还是AssetsLibrary?有什么想法如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

  

是我的问题还是AssetsLibrary?有什么想法如何解决这个问题?

很可能是您自己的代码导致泄漏。 Responsible Frame显示ALAsset的事实仅表示内存已在该库中分配。但如果你是那个记忆的拥有者,你就要对泄密事负责。

至于如何修复它,首先,试试Xcode中的静态分析器。这有时会有所帮助。

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

如果你不知道哪里可能会产生泄漏,那么一种有用的技术就是有选择地注释掉代码块(当然,你应该以合理的方式做到这一点,以便应用程序可以运行而不是崩溃)并再次检查仪器,直到泄漏消失(在这种情况下,你知道是什么导致它)。

答案 1 :(得分:1)

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

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

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

编辑:

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

编辑:

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