3

AVAssetExportSessionのように完了ハンドラーと非同期で戻るObjective-Cオブジェクトを使用する場合、次のようなコードで問題が発生しますか?

AVAssetExportSession* exportSession = [[AVAssetExportSession alloc] initWithAsset: composition presetName: AVAssetExportPresetHighestQuality];
[exportSession exportAsynchronouslyWithCompletionHandler: ^(void) {
    // export completed
    NSLog(@"Export Complete %d %@", exportSession.status, exportSession.error);
    [exportSession release];
    }];

InstrumentsはexportSessionをリークとして報告します。また、同じ方法を使用する独自のクラスがいくつかあり、それらもリークとして報告されます。

私が読んだすべてのことから、コードは適切なメモリ管理ルールに従う必要があるようですが、何かがアップしている必要があります。この記事へのリンクを見つけましたが、循環保持を引き起こしているとは思いません。

4

1 に答える 1

6

Objective-Cのブロックは、スコープ内のオブジェクトの所有権を自動的に取得し、循環参照を引き起こします。ブロックはexportSession暗黙的に保持され、exportSessionおそらくブロックを保持します。

メモリ管理ルールでは、できるだけ早くオブジェクトの所有権を放棄する必要があるとされています。したがって、あなたの場合、それを行うのに適切な場所は、への呼び出しの後exportAsynchronouslyWithCompletionHandler:です。

AVAssetExportSession* exportSession = [[AVAssetExportSession alloc] initWithAsset: composition presetName: AVAssetExportPresetHighestQuality];
[exportSession exportAsynchronouslyWithCompletionHandler: ^(void) {
    // export completed
    NSLog(@"Export Complete %d %@", exportSession.status, exportSession.error);
}];
[exportSession release];

循環参照は、そのように明白である必要がexportSessionあります。ブロックによって存続され、ブロック自体はオブジェクトによって存続されます。

ブロックを扱うときは、ガベージコレクション環境を使用することをお勧めします。

于 2010-09-13T04:50:34.067 に答える