我正在使用Profile找到任何内存泄漏。
我发现了2个有趣的泄漏,我无法理解:
Leaked Object | Responsible Library | Responsible Frame
ALAsset AssetsLibrary [ALAssetsGroup _enumerateAssetsAtIndexes:options:usingBlock:]_block_invoke_0125
ALAssetPrivate AssetsLibrary -[ALAsset initWithManagedAsset:library:]
是我的问题还是AssetsLibrary?有什么想法如何解决这个问题?
答案 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方法。这是泄漏的原因。