2012-02-20 28 views
7

Bazı ses dosyalarını dönüştürmede sorun yaşıyorum. Dönüştürürken büyük bir bellek sızıntısı alıyorum ve bu kod satırlarından geliyor. CMSampleBufferDaha fazla bellek sızıntısı

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; 
     } 
    } 

}]; 

sızıntılara sebep görünmektedir hattıdır

: CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];

Bu konuda kayboldum herhangi bir yardım büyük takdir edilecektir.

CEVAP: Düzeltildi - Yalnızca bu satırları if/else ifadesinin sonuna ekleyin.

cevap

12

CEVAP: Sabit - Yalnızca bu satırları if/else ifadesinin sonuna ekleyin.

CMSampleBufferInvalidate(nextBuffer); 
CFRelease(nextBuffer); 
nextBuffer = NULL; 
+1

Neden "CFRelease" den önce "CMSampleBufferInvalidate" diyorsunuz? – Meekohi

+0

@Meekohi, bu kesin siparişe ihtiyaç duymayabilir, bunu zaman zaman yaptım ve emin olmadım, biliyorum ki combo işi yaptı. – Krzemienski

+1

Örnek arabellek üzerinde CFRelease çağrısı, CMSampleBufferInvalidate ve sampleBuffer = NULL olmadan kullanıldığında bile benim için bir çakışma neden olur. CMSampleBufferInvalidate (nextBuffer) kullanmanız önerilir; nextBuffer = NULL; – Zigglzworth