2013-04-26 56 views
1

這需要我的頭。我從iPod庫中讀取音頻以分析音頻樣本,我可以做我想做的事,緩衝區總是泄漏,我得到低內存警告,應用程序是殺害。 我嘗試了所有建議,但沒有成功。下面的代碼被合併到一個靜態庫中,並且讀取音頻工作正常,只是緩衝區從未被釋放。我使用ARC,也試過不打電話CFRelease,但同樣的事情......感謝任何建議,我完全卡住了!CFRelease但仍然泄漏

- (NSInteger) getMP3Samples:(SInt16*)address{ 
    AudioBufferList audioBufferList; 

    if (_assetReader == nil) { 
     return 0; 
    } 

    _mp3Control.currentSampleBufferCount = 0; 
    CMSampleBufferRef nextBuffer =[_assetReaderOutput copyNextSampleBuffer]; 

    // Is the Song ended 
    if (nextBuffer == nil){ 
     if ([_assetReader status] == AVAssetReaderStatusCompleted) { 
      [_assetReader cancelReading]; 
     } 
     _assetReader = nil; 
     _assetReaderOutput = nil; 
     return _mp3Control.currentSampleBufferCount; 
    } 

    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
     nextBuffer, 
     NULL, 
     &audioBufferList, 
     sizeof(audioBufferList), 
     NULL, 
     NULL, 
     kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, 
     &_mp3Control.blockBuffer); 

    if (nextBuffer) { 
     CMSampleBufferInvalidate(nextBuffer); 
     CFRelease(nextBuffer); 
     nextBuffer=NULL; 
    } 

    for (int b=0; b < audioBufferList.mNumberBuffers; b++) { 
     memcpy((void *)(address+_mp3Control.currentSampleBufferCount),(void *)audioBufferList.mBuffers[b].mData,audioBufferList.mBuffers[b].mDataByteSize); 
     _mp3Control.currentSampleBufferCount+=audioBufferList.mBuffers[b].mDataByteSize; 
    } 
    /// 
    /// Return samples and not bytes!! 
    /// 
    return _mp3Control.currentSampleBufferCount/2; 
} 

回答

1

是否使用&釋放由CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer在(未公佈)調用返回的代碼塊緩衝區?
如果在調用getMP3Samples:之後沒有釋放存儲在&_mp3Control.blockBuffer中的對象,這可能是您的內存管理問題。 (核心基礎風格的對象不參與ARC)

你也可以通過分配運行你的代碼&泄漏儀器看到更多的細節(我只是在這裏猜測:))。

+0

非常感謝,這就是原因!而且我甚至可以在函數本身內部完成它,因爲我將樣本存入另一個緩衝區。再次感謝,我必須說蘋果文檔在這裏非常薄... – 2013-04-26 11:31:14

+0

不客氣! 是的 - 文檔有時會有點薄。但是你總是可以嘗試標題(例如,通過cmd +點擊Xcode中的方法名稱)。在覈心媒體的情況下,標題目前包含比實際文檔更多的文本:) – 2013-04-26 12:17:25

相關問題