我正在使用配置文件来查找任何内存泄漏。
我发现了两个有趣的漏洞,我无法理解:
Leaked Object | Responsible Library | Responsible Frame
ALAsset AssetsLibrary [ALAssetsGroup _enumerateAssetsAtIndexes:options:usingBlock:]_block_invoke_0125
ALAssetPrivate AssetsLibrary -[ALAsset initWithManagedAsset:library:]
是我的问题还是AssetsLibrary?有什么办法可以解决这个问题吗?
发布于 2013-05-27 18:13:49
问题出在资源库本身。它包含一个内存泄漏。证据是,下面的代码已经显示了分析器中的泄漏(请注意,我注释掉了将资产添加到可变数组中的行):
[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-01-23 19:43:41
是我的问题还是AssetsLibrary?有什么办法可以解决这个问题吗?
泄漏很可能是由您自己的代码引起的。Responsible Frame显示ALAsset
的事实仅意味着内存是在该库中分配的。但是,如果您是该内存的所有者,则应对泄漏负责。
至于如何修复它,首先,尝试一下Xcode中的静态分析器。这有时会有帮助。
如果没有,请检查您是如何使用AssetsLibrary或任何用于访问它的中间框架的。检查所有属性,以及每次调用alloc/init或便利性构造函数。
如果你不知道泄漏可能在哪里产生,一个有用的技术是选择性地注释掉代码块(当然,你应该以一种合理的方式这样做,这样应用程序就可以运行而不会崩溃),并再次检查Instruments,直到泄漏消失(在这种情况下,你知道是什么导致了泄漏)。
https://stackoverflow.com/questions/14478748
复制相似问题