我注意到我的AVAssetReader(閱讀器在這種情況下)retainCount繼續與此代碼上升。我相信我正在釋放我應該做的一切。有沒有辦法檢查CMSampleBufferRef參考計數?有沒有人看到我忘記發佈的東西?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的保留計數
我感動讀者的釋放測試在此之前該池釋放...
[pool release];
NSLog(@"Reader Count: %d", reader.retainCount);
[reader release];
,我得到的1
但是仍然記憶出現retainCount的預期結果從CMSampleBufferRefs泄漏因爲FigSampleBuffer正呆在附近。以下是我在儀器發現:
和調用堆棧導致CMSampleBufferRef ...
這是我已經退出循環之後,清理了一切,然後將其重新創建爲另一個AVAsset。正如我重複這個更多FigSampleBuffer出現在每個爆頭。
請注意,retainCount永遠無法返回n 0;一個釋放的對象,碰巧仍然有點可行,有時會返回1. – bbum