0

Profile を使用してメモリリークを見つけています。

私は理解できない2つの興味深いリークを見つけました:

Leaked Object |  Responsible Library | Responsible Frame

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

ALAssetPrivate  AssetsLibrary        -[ALAsset initWithManagedAsset:library:]

私の問題ですか、それとも AssetsLibrary ですか? これを修正する方法はありますか?

4

2 に答える 2

1

問題はアセット ライブラリ自体にあります。メモリリークが含まれています。証拠として、次のコードはすでにプロファイラーでリークを示しています (変更可能な配列にアセットを追加した行をコメントアウトしたことに注意してください)。

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

ALAsset ポインターの保持カウントを確認し、保持カウントが 1 より大きい場合は、時間を延長して自分で解放することで解決できます (自分で保持していない場合は、ブロックの最後で 1 になるはずです)。

編集:

リークは実際には ALAsset によって過剰に保持されている ALAssetPrivate オブジェクトであることに気付きました。ALAsset インスタンスの保持カウントは正しいです。

編集:

愚かな私、メモリ リークは実際には、それ自体の dealloc メソッドを含む ALAsset に実装したカテゴリが原因でした。これが漏れの原因でした。

于 2013-05-27T10:13:49.410 に答える
1

私の問題ですか、それとも AssetsLibrary ですか? これを修正する方法はありますか?

独自のコードが原因でリークが発生する可能性が非常に高くなります。Responsible Frame が示すという事実はALAsset、メモリがそのライブラリに割り当てられたことを意味するだけです。しかし、あなたがそのメモリの所有者である場合、リークの責任はあなたにあります。

修正方法としては、まずはXcodeの静的アナライザーを試してみてください。それは時々役立ちます。

そうでない場合は、AssetsLibrary またはそれにアクセスするために使用している中間フレームワークの使用方法を確認してください。すべてのプロパティと、alloc/init または便利なコンストラクターへの各呼び出しを確認してください。

リークが発生する可能性がある場所についての手がかりがない場合は、コードのブロックを選択的にコメントアウトし (もちろん、アプリが実行できてクラッシュしないように、賢明な方法でこれを行う必要があります)、Instruments に対して再度チェックすることをお勧めします。漏れがなくなるまで (その場合、何が原因かがわかります)。

于 2013-01-23T11:43:41.240 に答える