2

質問はタイトルにあります:「ARC がオンになっている場合、SystemSoundID を解放する必要がありますか?」ここに私のコードがあります:

NSURL *pathURL = [NSURL fileURLWithPath:path];
SystemSoundID soundid;
AudioServicesCreateSystemSoundID((__bridge_retained CFURLRef)pathURL, &soundid);
AudioServicesPlaySystemSound(soundid);

もしそうなら、いつリリースしますか?(静的メソッドを使用していて変更できないため、dealloc メソッドはありません)

また、これは現在、効果音を再生するための最良の方法ですか?このフレームワークは現在廃止されていると聞きました。

ありがとう!

4

2 に答える 2

4

はい、リリースする必要があります。ARC は Obj-C オブジェクトのみに関係し、aSystemSoundIDは obj-c オブジェクトではありません。AudioServicesDisposeSystemSoundID()ある時点で、自分の価値を呼び出す必要がありSystemSoundIDます。これは、システム サウンドの完了ルーチン ( を使用AudioServicesAddSystemSoundCompletion()) で行うことができます。

セルジオが話していることに関しては、pathURLオブジェクトをリークしています。__bridge_retainedオブジェクトの所有権を CoreFoundation に転送する を使用しました。(__bridge CFURLRef)pathURLおそらく、所有権を譲渡しない に変更する必要があります。AudioServices API は、必要に応じてオブジェクトを保持します。

于 2012-06-28T22:32:19.037 に答える
1

clangrefによると

(__bridge_retained T)opは、保持可能なオブジェクトポインタ型である必要があるオペランドを、保持不可能なポインタ型である必要がある宛先型にキャストします。ARCは、ローカル値の通常の最適化に従って値を保持し、受信者はその+1のバランスを取る責任があります。

したがって、リリースを行う必要があります。

言い換えると、ブリッジキャストで発生するのは、の所有権がpathURLCFに渡され、ARCの範囲外になるということです。

于 2012-06-28T22:28:55.060 に答える