【问题标题】:AVAudioPlayer not releasing memoryAVAudioPlayer 不释放内存
【发布时间】:2010-01-08 04:16:31
【问题描述】:

我初始化了一个 ivar AVAudioPlayer 变量,播放并尝试释放它的内存。在发布行之后,它不会设置为 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;

【问题讨论】:

    标签: iphone objective-c cocoa-touch avaudioplayer


    【解决方案1】:

    嗯,

    AVAudioPLayer 异步播放音频文件。开始播放后不要松开播放器,这可能会导致一些与内存相关的错误,并且您的音频文件也可能无法播放。

    您应该通过 avaudioplayerdelegate 释放播放器。更多详情可以查看answer too

    希望这会有所帮助。

    谢谢,

    马杜普

    【讨论】:

    • 我注意到,即使在委托方法 audioPlayerDidFinishPlaying 中释放并设置为零时,它也没有设置为 0x0。
    【解决方案2】:
     - (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];
    

    【讨论】:

    • 谢谢。如何背靠背播放声音?我通过方法进行了一个又一个设置,类似于您在上面所做的。但是,只有第二个播放。
    • 你是如何实现的???最好的方法是使用方法 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successful:(BOOL)flag { if (flag) { //your mathod to play next one. } }
    • 呃,伙计,你不是说[self.appSoundPlayer release];吗?如果您将其声明为@property (nonatomic, retain) AVAudioPlayer *appSoundPlayer;,您肯定需要使用点语法(self.appSoundPlayer)访问它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2011-06-30
    • 2016-09-14
    • 2015-08-19
    • 2012-05-15
    • 2018-01-26
    • 2011-09-30
    相关资源
    最近更新 更多