首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >泄漏的对象: ALasset和ALAssetPrivate

泄漏的对象: ALasset和ALAssetPrivate
EN

Stack Overflow用户
提问于 2013-01-23 19:35:40
回答 2查看 503关注 0票数 0

我正在使用配置文件来查找任何内存泄漏。

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

代码语言:javascript
运行
复制
Leaked Object |  Responsible Library | Responsible Frame

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

ALAssetPrivate  AssetsLibrary        -[ALAsset initWithManagedAsset:library:]

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-27 18:13:49

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

代码语言:javascript
运行
复制
[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方法。这就是泄漏的原因。

票数 1
EN

Stack Overflow用户

发布于 2013-01-23 19:43:41

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

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14478748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档