-1

プロジェクトを ARC に変換しました。Xcode は、コード内のこの行を例から変更しました

soundFileURLRef = (CFURLRef) [tapSound retain];

soundFileURLRef = (__bridge CFURLRef) tapSound;

しかし、音は再生されません。どうしたの?

- (IBAction)buttonTapped:(UIButton *)sender {
        // Create the URL for the source audio file. The URLForResource:withExtension: method is new in iOS 4.0
        NSURL *tapSound = [[NSBundle mainBundle] URLForResource: @"abide" withExtension: @"aif"];

        CFURLRef        soundFileURLRef;
        SystemSoundID   soundFileObject;

        // Store the URL as a CFURLRef instance
        soundFileURLRef = (__bridge CFURLRef) tapSound; // I think this line is wrong

        // Create a system sound object representing the sound file.
        AudioServicesCreateSystemSoundID (

                                          soundFileURLRef,
                                          &soundFileObject
                                          );

        AudioServicesPlaySystemSound (soundFileObject);
    }
4

1 に答える 1

3

論理的には、コードはまったく問題ないように見えます。アプリケーションに実際にバンドルされていないabide.aifか、誤って名前を間違って入力したと思われます (拡張子はaiff?)。[NSBundle URLForResource:withExtension:]これを確認するには、呼び出しの後にブレークポイントを置き、の内容を確認しtapSoundます。

「バンドルリソースのコピー」にターゲット用に実際に含めていることを確認してください。

さらに、 へAudioServicesCreateSystemSoundIDの呼び出しは呼び出しとバランスを取る必要があることに注意してくださいAudioServicesDisposeSystemSoundID。ここで不必要にメモリを割り当てていますが、ARC はこれを処理しません。

これを行う理想的な方法は、すべての作業をorメソッドで作成SystemSoundIDし、ivar として保存し、ボタン タップ メソッドでのみ呼び出すことです。dealloc メソッドでは、 を呼び出す必要があります。awakeFromNibviewDidLoadAudioServicesPlaySystemSoundAudioServicesDisposeSystemSoundID

それがどうなるか教えてください。

于 2012-09-26T12:17:39.433 に答える