我注意到,我的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);
}编辑:
因此,在进一步调试之后,我能够确认在循环退出并自动释放池被清除之后,AVAssetReader确实降到了1的retainCount
我在读取器发布之前把池版本移到了测试中.
[pool release];
NSLog(@"Reader Count: %d", reader.retainCount);
[reader release];我得到了retainCount值为1的预期结果。
然而,由于FigSampleBuffer的内存仍然存在,内存似乎仍在从CMSampleBufferRefs中泄漏。这是我在仪器中发现的:

以及通向CMSampleBufferRef的呼叫堆栈..。

这是在我退出循环、清理所有内容、然后为另一个AVAsset重新创建它之后。正如我重复的那样,菲格-桑普·巴弗的照片出现在每一张头像中。
发布于 2011-08-25 17:59:56
不要打电话给retainCount,这是没用的。
这段代码没有什么明显的问题,内存管理是明智的。
真正的问题是:你是否平衡了所有的版本?如果是的话,你就完了。
如果您看到了无限内存的增长,那么请提交一个bug。
任何给定时间的绝对retainCount都是实现细节,该值很可能反映超出您控制范围的内部实现细节。此外,retainCount从不反映对象当前是否在自动释放池中。
唯一能够绝对了解retainCount的情况是:
您实现了一个新的根类( coincidence)
。
https://stackoverflow.com/questions/7194207
复制相似问题