2014-02-25 27 views
3

在這裏,我曾經使用AVAudioPlayer Framework播放歌曲。但願這是玩,但如果我在其他歌曲點擊來自Songslist我將檢查條件:如何從AVAudioPlayer發佈NSDATA?

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]; 

回答

2

AVAudioPlayer#data是隻讀的非保留財產。因此,數據不會被保留,您也不需要將其解除(默認爲assigned)。

但是,正如我所說,它是read-only所以你不能設置它,如果你想改變軌道。你也應該不是已initialied對象調用init...,如代碼:

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

我相信你想要的東西預期的行動是relesae現有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

+0

看到這裏我不想再創造再與ALLOC。因爲玩家只創建一次。我想替換nsdata。我也用[self.audioplayer stop]; [self.audioplayer release] ;.如果我再點擊一首歌曲,「編譯器告訴BAD ACCESS」,此代碼再次適用於不同的歌曲。 – iTag

+1

'[self.audioPlayer發佈]'釋放你的'AVAudioPlayer'。之後它就無法使用了,因爲在某些時候內存將會被回收(所以你不能在這個時候播放曲目或者出現各種各樣的錯誤)。不幸的是,由於AVAudioPlayer#data屬性標記爲readonly(無法設置),因此無法重置數據。請參閱[AVAudioPlayer類參考](https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Chapters/Reference.html#//apple_ref/occ/instp/AVAudioPlayer/data)。你必須重置你的播放器。 – wmorrison365

+0

不良訪問=您釋放了內存,但仍在使用播放器(如您在評論中所述)。也許還可以看看[這個Cocoa內存管理指南](https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html)(注意它是Cocoa)。 – wmorrison365