Утечка памяти в CMSampleBufferRef - PullRequest
7 голосов
/ 20 февраля 2012

Так что у меня возникла проблема с конвертированием звука.Я получаю огромную утечку памяти при преобразовании, и это происходит из-за этих строк кода.

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?

1 Ответ

12 голосов
/ 22 февраля 2012

ОТВЕТ: Исправлено - просто добавьте эти строки в конце оператора if / else.

CMSampleBufferInvalidate(nextBuffer);
CFRelease(nextBuffer);
nextBuffer = NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...