2016-07-01 25 views
6

Làm thế nào để sử dụng "CFRetain (sampleBuffer)" và "CFRelease (sampleBuffer)" trong Swift? enter image description here CFRetain is unavailable: Core Foundation objectes are automatically memory managed.Làm thế nào để sử dụng "CFRetain (sampleBuffer)" trong 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); 

    }); 
} 

Nếu bạn cần phải tham khảo đối tượng CMSampleBuffer ngoài phạm vi của phương pháp này, bạn phải CFRetain nó và sau đó CFRelease nó khi bạn đã kết thúc với nó. (Apple Document)

+0

Bạn có _need_ để "tham chiếu đối tượng CMSampleBuffer bên ngoài phạm vi của phương pháp này" không? –

+0

Có, tôi muốn 'appendSampleBuffer' trong' _writingQueue '. – Limon

+0

'appendSampleBuffer:' làm gì với bộ đệm? Liệu nó sao chép nội dung của nó vào một số bộ nhớ khác mà nó sở hữu, hay nó sử dụng nó như là-là? Trong trường hợp đầu tiên, cặp giữ/giải phóng của bạn không cần thiết tôi nghĩ. –

Trả lời

1

Theo Apple Doc

Memory Managed Objects

Lõi Foundation đối tượng trở về từ API chú thích sẽ được tự động bộ nhớ được quản lý trong Swift-bạn không cần phải gọi CFRetain, CFRelease hoặc CFAutorelease tự hoạt động.

Nếu bạn quay trở lại cốt lõi Foundation đối tượng từ chức năng C của riêng bạn và phương pháp Objective-C, bạn có thể chú thích cho họ với một trong hai CF_RETURNS_RETAINED hoặc vĩ mô CF_RETURNS_NOT_RETAINED để tự động chèn cuộc gọi quản lý bộ nhớ. Bạn cũng có thể sử dụng các macro CF_IMPLICIT_BRIDGING_ENABLED và CF_IMPLICIT_BRIDGING_DISABLED để bao gồm các khai báo hàm C tuân theo Chính sách về quyền sở hữu chính sách quyền sở hữu để điều chỉnh bộ nhớ từ đặt tên.

Nếu bạn chỉ sử dụng các API được chú thích không trả về gián tiếp các đối tượng Foundation Foundation, bạn có thể bỏ qua phần còn lại của phần này. Nếu không, hãy tiếp tục tìm hiểu về cách làm việc với các đối tượng Core Foundation không được quản lý.

0

Bạn chỉ cần sampleBuffer = nil để giải phóng thủ công. Nhưng bạn nên sao chép con trỏ trước khi sử dụng nó CMSampleBufferCreateCopy(kCFAllocatorDefault, sampleBuffer, &newBuffer) . Trong trường hợp này, hãy đặt newBuffer thành không trước khi tạo bản sao mới sampleBuffer.

Các vấn đề liên quan