我注意到我的AVAssetReader(本例中的阅读器)retainCount继续使用此代码上升。我相信我正在释放我应该做的一切。有没有办法检查CMSampleBufferRef引用计数?有没有人看到我忘记发布的东西?
AVAssetReaderTrackOutput* trackOutput = (AVAssetReaderTrackOutput*)[reader.outputs objectAtIndex:0];
NSLog(@"PreReader Count: %d", reader.retainCount);
CMSampleBufferRef sampleBufferRef = [trackOutput copyNextSampleBuffer];
NSLog(@"Reader Count: %d", reader.retainCount); //retainCount has increased by 1
if (sampleBufferRef) {
CopySampleBufferToStream(sampleBufferRef, stream);
CMSampleBufferInvalidate(sampleBufferRef);
CFRelease(sampleBufferRef); //Retain count doesn't go back down, item hasn't been deleted?
}
将此作为CopySampleBufferToStream的关键公园
void CopySampleBufferToStream(CMSampleBufferRef sampleBufferRef, cSoundStream* stream)
{
CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(sampleBufferRef);
size_t length = CMBlockBufferGetDataLength(blockBufferRef);
do
{
//...
OSStatus result = CMBlockBufferCopyDataBytes(blockBufferRef, startOffset, copyLength, (stream->mSrcBuffers[stream->mActiveWriteIdx].mData + stream->mSrcBuffers[stream->mActiveWriteIdx].mBufferOffset));
//...
} while(stream->ContinueLoading() && stream->TransitionNotReady() && copyLength < length);
}
修改
因此,在进一步调试之后,我能够确认在循环退出并且Autorelease池被清除后,AVAssetReader确实降到了keepCount为1
我在读者发布之前移动了池版本来测试这个......
[pool release];
NSLog(@"Reader Count: %d", reader.retainCount);
[reader release];
我得到了retainCount为1的预期结果。
然而,由于FigSampleBuffer的存在,内存仍然似乎从CMSampleBufferRefs泄漏。以下是我在仪器中发现的内容:
和调用堆栈通向CMSampleBufferRef ...
这是在我退出循环后,清理所有内容,然后重新创建另一个AVAsset。当我重复这个时,更多的FigSampleBuffer出现在每个爆头中。
答案 0 :(得分:1)
不要致电retainCount
;它没用。
该代码没有任何明显的错误,明智的内存管理。
真正的问题是;您是否将所有保留与发布保持平衡?如果是这样,你就完成了。
如果你有并且你看到无限的内存增长,那么就提交一个bug。
任何给定时间的绝对retainCount都是一个实现细节,该值很可能反映出您无法控制的内部实现细节。此外,retainCount从不反映对象当前是否在自动释放池中。
唯一可以绝对知道retainCount的时间是: