2016-07-01 13 views
6

Jak używać "CFRetain (sampleBuffer)" i "CFRelease (sampleBuffer)" w Swift? enter image description here CFRetain is unavailable: Core Foundation objectes are automatically memory managed.Jak używać "CFRetain (sampleBuffer)" w Swift?

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 

    [self appendVideoSampleBuffer:sampleBuffer]; 

} 

- (void)appendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer 
{ 
    dispatch_async(_writingQueue, ^{ 

     CFRetain(sampleBuffer); 
     [_videoInput appendSampleBuffer:sampleBuffer]; 
     CFRelease(sampleBuffer); 

    }); 
} 

Jeśli trzeba odwoływać się do obiektu CMSampleBuffer poza zakresem tej metody, musisz go CFRetain a następnie CFRelease go po zakończeniu z nim. (Apple Document)

+0

Czy "chcesz" odwołać się do obiektu CMSampleBuffer poza zakresem tej metody? –

+0

Tak, chcę "appendSampleBuffer" w "_writingQueue". – Limon

+0

Co robi "appendSampleBuffer:" z buforem? Czy kopiuje swoją zawartość do innej pamięci, którą posiada, czy używa jej tak jak jest? W pierwszym przypadku twoja para retain/release nie powinna być potrzebna. –

Odpowiedz

1

Według Apple Doc

pamięci obiektów zarządzanych

Fundacja Rdzeń obiektów zwracanych z adnotacjami API są automatycznie pamięć zarządzana Swift-nie potrzeba podniesienia zarzutu CFRetain, CFRelease lub CFAutorelease działa sam.

Jeśli wrócisz Fundacja Rdzeń obiektów z własnych funkcji C i metod Objective-C, można opisywać je albo CF_RETURNS_RETAINED lub CF_RETURNS_NOT_RETAINED makro do wstawiania połączeń automatycznie zarządzania pamięcią. Można także użyć makr CF_IMPLICIT_BRIDGING_ENABLED i CF_IMPLICIT_BRIDGING_DISABLED, aby zamknąć deklaracje funkcji C, które są zgodne z zasadami nazewnictwa polityki właścicielskiej Core Foundation , aby wywnioskować zarządzanie pamięcią z nazywania.

Jeśli używasz tylko adnotowanych interfejsów API, które nie zwracają pośrednio obiektów podstawowych Core, możesz pominąć resztę tej sekcji. W przeciwnym razie, kontynuuj, aby dowiedzieć się o pracy z niezarządzanymi obiektami Core Foundation .

0

Wystarczy ręcznie zwolnić numer sampleBuffer = nil. Zaleca się jednak skopiowanie wskaźnika przed jego użyciem: CMSampleBufferCreateCopy(kCFAllocatorDefault, sampleBuffer, &newBuffer) . W takim przypadku należy ustawić wartość zerową przed utworzeniem kopii nowego sampleBuffer.

Powiązane problemy