Iphone CFD释放,但仍在泄漏

Iphone CFD释放,但仍在泄漏,iphone,ios,core-audio,Iphone,Ios,Core Audio,这让我很头疼。我从iPod库中读取音频以分析音频样本,我可以做我想做的事情,缓冲区总是泄漏,我收到内存不足警告,应用程序被关闭。 我尝试了所有的建议,但没有成功。下面的代码包含在一个静态库中,读取音频效果很好,只是缓冲区永远不会被释放。我使用了ARC,也试着不调用CFRelease,但同样的事情。。。谢谢你的建议,我完全被卡住了 - (NSInteger) getMP3Samples:(SInt16*)address{ AudioBufferList audioBufferList;

这让我很头疼。我从iPod库中读取音频以分析音频样本,我可以做我想做的事情,缓冲区总是泄漏,我收到内存不足警告,应用程序被关闭。 我尝试了所有的建议,但没有成功。下面的代码包含在一个静态库中,读取音频效果很好,只是缓冲区永远不会被释放。我使用了
ARC
,也试着不调用
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;
}
-(NSInteger)getmp3样本:(SInt16*)地址{
AudioBufferList AudioBufferList;
如果(_assetrader==nil){
返回0;
}
_mp3Control.currentSampleBufferCount=0;
CMSampleBufferRef nextBuffer=[\u assetReaderOutput copyNextSampleBuffer];
//这首歌结束了吗
如果(nextBuffer==nil){
如果([\u AssetTreader status]==AVAssetReaderStatusCompleted){
[_assetradercancelreading];
}
_assetReader=零;
_assetReaderOutput=零;
返回_mp3Control.currentSampleBufferCount;
}
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
下一步,
无效的
&音频缓冲列表,
sizeof(音频缓冲列表),
无效的
无效的
kCMSampleBufferFlag_Audio BufferList_确保16通过对齐,
&_MP3控制块缓冲区);
如果(下一个缓冲区){
CMSampleBufferInvalidate(nextBuffer);
CFRelease(nextBuffer);
nextBuffer=NULL;
}
对于(int b=0;b
您是否正在(未发布)调用代码中使用并释放由
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer
返回的块缓冲区?
如果调用
getMP3Samples:
后未释放存储在
中的对象,则可能是内存管理问题。(核心基础样式对象不参与圆弧)


您还可以通过分配和泄漏工具运行代码以查看更多详细信息(我只是在这里猜测:)。

您是否正在使用并释放(未发布)调用代码中由
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer
返回的块缓冲区?
如果调用
getMP3Samples:
后未释放存储在
中的对象,则可能是内存管理问题。(核心基础样式对象不参与圆弧)


您还可以通过分配和泄漏工具运行代码以查看更多详细信息(我只是在这里猜测:)。

非常感谢,这就是原因!我甚至可以在函数本身内部执行,因为我将样本存储到另一个缓冲区中。再次非常感谢,我必须说苹果的文档在这里很薄…不客气!是-文档有时有点少。但是您可以尝试使用头(例如,通过cmd+单击Xcode中的方法名)。在核心媒体的情况下,标题当前包含的文本比实际文档多得多:)非常感谢,这就是原因!我甚至可以在函数本身内部执行,因为我将样本存储到另一个缓冲区中。再次非常感谢,我必须说苹果的文档在这里很薄…不客气!是-文档有时有点少。但是您可以尝试使用头(例如,通过cmd+单击Xcode中的方法名)。对于核心媒体,标题当前包含的文本比实际文档多得多:)