7
所以我在轉換某些音頻時遇到問題。轉換時,我遇到了巨大的內存泄漏,它來自這些代碼行。CMSampleBufferRef內存泄漏
dispatch_queue_t mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL);
[assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue
usingBlock:^
{
while (assetWriterInput.readyForMoreMediaData)
{
CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];
if (nextBuffer)
{
[assetWriterInput appendSampleBuffer: nextBuffer];
nextBuffer = NULL;
}
else
{
// done!
[assetWriterInput markAsFinished];
[assetWriter finishWriting];
[assetReader cancelReading];
NSDictionary *outputFileAttributes = [[NSFileManager defaultManager]
attributesOfItemAtPath:exportPath
error:nil];
NSNumber *doneFileSize = [NSNumber numberWithLong:[outputFileAttributes fileSize]];
[self performSelectorOnMainThread:@selector(updateCompletedSizeLabel:)
withObject:doneFileSize
waitUntilDone:NO];
// release a lot of stuff
[assetReader release];
[assetReaderOutput release];
[assetWriter release];
[assetWriterInput release];
[exportPath release];
break;
}
}
}];
似乎引起泄漏的行是: CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];
我迷失在這一個任何幫助將不勝感激。
答案: 固定 - 只需在if/else語句的末尾添加這些行即可。
CMSampleBufferInvalidate(nextBuffer);
CFRelease(nextBuffer);
nextBuffer = nil; // NULL?
爲什麼在CFRelease之前調用'CMSampleBufferInvalidate'? – Meekohi 2013-10-30 21:32:50
@Meekohi可能不需要這個確切的順序,這是前段時間做的,但我不確定,但我知道組合完成了這項工作。 – Krzemienski 2013-12-18 01:05:52
即使使用沒有CMSampleBufferInvalidate和sampleBuffer = NULL的示例緩衝區,調用CFRelease也會導致崩潰。我建議只使用CMSampleBufferInvalidate(nextBuffer); nextBuffer = NULL; – Zigglzworth 2014-07-06 12:11:19