2

私は大規模な iPhone プロジェクトの終わりに近づいており、メモリ リークをチェックしているときに、この巨大なプロジェクトに出くわしました。このチュートリアルに従ってサウンドを実装しました。

http://www.gehacktes.net/2009/03/iphone-programming-part-6-multiple-sounds-with-openal/

魅力的に機能し、多くの人が使用していますが、サウンドが最初にロードされたときにプロジェクトの開始時に大きなリークが発生します。以下は、リークの開始コード行です。

[[Audio sharedMyOpenAL] loadSoundWithKey:@"music" File:@"Music" Ext:@"wav" Loop:true];
[[Audio sharedMyOpenAL] loadSoundWithKey:@"btnPress" File:@"BtnPress" Ext:@"wav" Loop:false];
[[Audio sharedMyOpenAL] loadSoundWithKey:@"ting1" File:@"GlassTing1" Ext:@"wav" Loop:false];

etc.etc.全部で20音を搭載。より具体的には、Audio.m ファイルで、このコードのチャンク:

+ (Audio*)sharedMyOpenAL {

@synchronized(self) {
    if (sharedMyOpenAL == nil) {
        sharedMyOpenAL = [[self alloc] init]; // assignment not done here

    }
}
return sharedMyOpenAL;
}

これを解決する方法がわかりません。この問題に関するヘルプをいただければ幸いです。

ありがとう。

4

1 に答える 1

2

「リーク」は単なるAudioシングルトンではありませんか? リーク検出がどのように機能するかはわかりませんが、特定の観点から見ると、ほとんどのシングルトンアプリケーションの終了後にのみメモリを解放するため、リークです。

これが本当に当てはまる場合は、サウンドで使用されているメモリを解放する必要があるかどうかによって異なります。メモリ使用量が増えてはならないので、アプリケーションが殺されるまでますます多くのメモリを消費する「従来のリーク」シナリオについて心配する必要はありません。使用しているコードはサウンドのアンロードをサポートしていないようです。そのため、メモリを解放したい場合は、そのコードを自分で追加する必要があります。

個人的な見解: シングルトンを使用して効果音エンジンを作成することは、適切な設計ではありません。サウンドの管理が面倒になり (これはまさにあなたが直面している問題です)、シングルトンは多くの不必要な定型コードを追加するなどです。私はOpenAL SFX エンジン での試みでそれを行いました。もちろん、私は間違っているかもしれません。


更新:魔法の「割り当てはここでは行わない」が鍵だと思います。シングルトン コードはApple ドキュメントから取得されますが、誰かが追加の割り当てを挿入しました。メソッドは次のsharedFooようになります。

+ (MyGizmoClass*)sharedManager
{
    @synchronized(self) {
        if (sharedGizmoManager == nil) {
            [[self alloc] init]; // assignment not done here
        }
    }
    return sharedGizmoManager;
}

に追加の割り当てを実行するとself、探しているリークが作成されます。

于 2009-10-13T08:34:55.363 に答える