0

システムサウンドを再生しています...

    NSString *path = [NSString stringWithFormat:@"%@%@",
                      [[NSBundle mainBundle] resourcePath],
                      @"/heartbeat.wav"];

    //declare a system sound id
    SystemSoundID soundID4;

    //Get a URL for the sound file
     NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];

    //Use audio sevices to create the sound
    AudioServicesCreateSystemSoundID((__bridge_retained CFURLRef)filePath, &soundID4);

    //Use audio services to play the sound
    AudioServicesPlaySystemSound(soundID4);

    AudioServicesDisposeSystemSoundID(soundID4);

これが問題かどうかはわかりませんが、「分析」で実行すると、潜在的なリークとして表示されます。シミュレーターで何度もアプリを実行すると、アプリの速度が低下するにつれて、明らかに何らかのリークが発生しています。アークを使用せずにこれに対処する方法の例を見つけましたが、何も使用しません。どんな提案でも大歓迎です。

4

1 に答える 1

1

「潜在的なリークとして浮上します」。それは何ですか"?

2 つ目は、プログラムがどんどん遅くなるのを観察してメモリ リークを分析しないことです。実際、物理 RAM を使い果たし、大量のスワッピングを引き起こしている場合を除き、これはメモリ リークの通常の症状ではありません。Leaks インストゥルメントのようなものを使用して、到達不能になったメモリを実際に特定することで、リークを診断します。

そうは言っても、あなたはしたくない__bridge_retained、ただしたいだけです__bridge。andキャストよりもCFBridgingRetain()and関数を好む理由の 1 つは、このような間違いを犯す可能性がはるかに低いことです。たとえば、次のように書いたことはありません。CFBridgingRelease()__bridge_retained__bridge_transfer

AudioServicesCreateSystemSoundID(CFBridgingRetain(filePath), &soundID4);

まずfilePath、関数に渡すためだけに保持する必要がないことは明らかです。第 2 に、 -style 関数を呼び出すと、バランスを取るために -style 関数をCFRetain()呼び出す責任があることが明確になります。CFRelease()

于 2012-05-06T18:05:42.727 に答える