2

なぜこれが漏れているのか誰か教えてもらえますか?私はCFURLRefを解放すると思ったCFRelease()を使用しています

関数 'CFBridgingRetain' への呼び出しは、+1 の保持カウントを持つ Core Foundation オブジェクトを返します
オブジェクトがリークしました: 割り当てられたオブジェクトは、この実行パスで後で参照されず、+1 の保持カウントがあります

  -(void) playGuitarNote:(NSString *)noteVal {

    AudioServicesDisposeSystemSoundID(soundId);
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef = CFBundleCopyResourceURL(mainBundle,CFBridgingRetain(noteVal), CFSTR("aiff"), NULL);
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundId);
    AudioServicesPlaySystemSound(soundId);
    CFRelease(soundFileURLRef);
    noteVal = nil;

}
4

2 に答える 2

5

そこに電話してはいけませんCFBridgingRetain()__bridgeキャストを使用する必要があります。

CFURLRef soundFileURLRef = CFBundleCopyResourceURL(mainBundle,(__bridge CFStringRef)noteVal, CFSTR("aiff"), NULL);

の所有権を変更するのではなく、noteValそれを渡し、コンパイラに別の (ただし互換性のある) 型として扱うように指示するだけです。

于 2013-02-11T02:42:29.553 に答える
2

CFBridingRelease() 保持カウントを減らすには、呼び出す必要があります。したがって、返されたオブジェクトへのポインタを保存し、CFBridgingRetain()必要がなくなったら解放します。

Foundation 関数のドキュメントを参照してください。

または、呼び出す代わりにブリッジキャストを使用できますCFBridgingRetain()

于 2013-02-11T02:40:29.353 に答える