【问题标题】:Leaked Objects: ALasset and ALAssetPrivate泄露对象:ALAsset 和 ALAssetPrivate
【发布时间】:2013-01-23 11:35:40
【问题描述】:

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

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

Leaked Object |  Responsible Library | Responsible Frame

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

ALAssetPrivate  AssetsLibrary        -[ALAsset initWithManagedAsset:library:]

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

【问题讨论】:

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


    【解决方案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 方法。这就是泄漏的原因。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 所以我不知道泄漏的确切位置,我明白了。谢谢
      • 所以评论所有块我会找到合适的块。我也不明白什么是资产私有。它是与资产一起保留还是它是什么?我从不使用这样的对象。
      • 是的,您可以“尝试并检查”,一次一个块。另外:自上而下,通过注释掉一大块,然后更深入。 AssertPrivate 是某个 ALAsset 实例拥有的对象;如果你泄露了后者,前者也会泄露。
      • 很高兴能帮上忙。希望你能很快找到它。如果您使用 ARC,请专门查找循环依赖项(例如,使用 self 或块内的属性等)
      猜你喜欢
      • 2014-02-25
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多