【问题标题】:How to release the NSDATA from AVAudioPlayer?如何从 AVAudioPlayer 中释放 NSDATA?
【发布时间】:2014-02-25 10:21:28
【问题描述】:

在这里,我曾经使用AVAudioPlayer Framework 播放歌曲。希望它正在播放,但如果我点击歌曲列表中的其他歌曲,我会检查情况:

if(player.isPlaying == YES)
{
    [player stop];
    // And also i need to release or remove the existing NSDATA from the Player. otherwise the player won't release the existing data. So the memory pressure occurring in my project. 
}
self.audioPlayer = [self.audioPlayer initWithData:m_currentMusic.fileData error:&error];
[self.audioPlayer prepareToPlay];
[self.audioPlayer play];

【问题讨论】:

    标签: ios objective-c memory-management avaudioplayer


    【解决方案1】:

    AVAudioPlayer#data 是只读非保留属性。因此,数据不会保留,您无需释放它(默认为assigned)。

    但是,正如我所说,它是read-only,因此如果您想更改曲目,则无法设置它。你也不应该在已经初始化的对象上调用init...,就像在你的代码中一样:

    self.audioPlayer=[self.audioPlayer initWithData:m_currentMusic.fileData error:&error];
    

    我相信您想要的预期操作是释放您现有的self.audioPlayer 并重新创建一个新的,如下所示:

    // stop player as in your original code...
    [self.audioPlayer release];
    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithData:m_currentMusic.fileData error:&error];
    self.audioPlayer = newPlayer;
    [self.audioPlayer setDelegate:self];
    [newPlayer release];
    

    请注意,release 将导致您的原始轨道 data 被回收(因为它未保留)。

    另见Core Audio Overview

    【讨论】:

    • 这里我不想再次创建 & 再次分配。因为玩家只创建了一次。我想替换nsdata。我也使用了 [self.audioplayer stop]; [self.audioplayer 发布];.如果我再单击一首歌曲“编译器告诉错误访问”,此代码将再次适用于不同的歌曲。
    • [self.audioPlayer release] 正在释放你的AVAudioPlayer。在那之后它就无法使用了,因为在某个时候内存将被回收(所以你不能在那个时候播放曲目,否则会发生各种讨厌的事情)。不幸的是,您也不能只重置数据,因为属性AVAudioPlayer#data 被标记为readonly(无法设置)。见AVAudioPlayer class reference。您必须重置播放器。
    • BAD ACCESS = 您释放了内存但仍在使用播放器(正如您在评论中描述的那样)。也许也可以看看this Cocoa memory management guide(注意它是可可)。
    • 实际上,另一个考虑可能是在播放器实际确认它已停止播放您的曲目时使用委托释放您的播放器。这可以确保没有内存问题,但无论哪种方式,您都必须释放并重新创建播放器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2012-01-18
    • 2012-05-22
    相关资源
    最近更新 更多