1

ivar AVAudioPlayer 変数を初期化し、再生して、そのメモリを解放しようとします。release 行以降は 0x0 になりません。nil 行の後は 0x0 に変わりません。AVAudioPlayer はメモリを解放するために何か特別なものを必要としますか?

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: @"mysound" ofType: @"aif" inDirectory:@"/"]] error: &err];
audioPlayer.numberOfLoops = 0;
audioPlayer.volume = .5;
[audioPlayer prepareToPlay];
[audioPlayer play];
[audioPlayer release];
audioPlayer = nil;
4

2 に答える 2

2

良い、

AVAudioPLayer はオーディオ ファイルを非同期的に再生します。再生を開始した後にプレーヤーを解放しないでください。メモリ関連のエラーが発生し、オーディオ ファイルも再生されない可能性があります。

avaudioplayerdelegate を介してプレーヤーを解放する必要があります。詳細については、この回答も確認してください。

お役に立てれば。

ありがとう、

マドゥップ

于 2010-01-08T04:24:28.867 に答える
1
 - (IBAction) playaction {

        NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"songname" ofType:@"mp3"];
        NSURL *newURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
        self.soundFileURL = newURL;
        [newURL release];
        [[AVAudioSession sharedInstance] setDelegate: self];
        [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];

    // Registers the audio route change listener callback function
    AudioSessionAddPropertyListener (
                                     kAudioSessionProperty_AudioRouteChange,
                                     audioRouteChangeListenerCallback,
                                     self
                                     );

    // Activates the audio session.

    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];

    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: soundFileURL error: nil];
    self.appSoundPlayer = newPlayer;
    [newPlayer release];
    [appSoundPlayer prepareToPlay];
    [appSoundPlayer setVolume: 1.0];
    [appSoundPlayer setDelegate: self];
    [appSoundPlayer play];

}

ここで、 appSoundPlayer はヘッダー ファイルで次のように宣言されています。

AVAudioPlayer *appSoundPlayer;

これは、宣言されて合成されたプロパティであり、dealloc メソッドで次のように解放されます。

[appSoundPlayer release];
于 2010-01-08T04:40:21.900 に答える