Управляет ли swift памятью CVPixelBuffer, которую я создаю из CVPixelBufferCreate? - PullRequest
0 голосов
/ 12 июня 2019

пусть сказал, что хотел сохранить с выхода камеры

let imageBuffer:CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
some_list.append(imageBuffer)

**

А вот как функция копирования определяется расширением CVPixelBuffer

extension CVPixelBuffer {
    func copy() -> CVPixelBuffer {
        precondition(CFGetTypeID(self) == CVPixelBufferGetTypeID(), "copy() cannot be called on a non-CVPixelBuffer")
        var _copy : CVPixelBuffer?
        CVPixelBufferCreate(
            nil,
            CVPixelBufferGetWidth(self),
            CVPixelBufferGetHeight(self),
            CVPixelBufferGetPixelFormatType(self),
            CVBufferGetAttachments(self, CVAttachmentMode.shouldPropagate),
            &_copy)
        guard let copy = _copy else { fatalError() }
        CVPixelBufferLockBaseAddress(self, CVPixelBufferLockFlags.readOnly)
        CVPixelBufferLockBaseAddress(copy, CVPixelBufferLockFlags(rawValue: 0))
        let dest = CVPixelBufferGetBaseAddress(copy)
        let source = CVPixelBufferGetBaseAddress(self)
        let height = CVPixelBufferGetHeight(self)
        let bytesPerRow = CVPixelBufferGetBytesPerRow(self)
        memcpy(dest, source, height * bytesPerRow)
        CVPixelBufferUnlockBaseAddress(copy, CVPixelBufferLockFlags(rawValue: 0))
        CVPixelBufferUnlockBaseAddress(self, CVPixelBufferLockFlags.readOnly)
        return copy
    }
}

Вопрос в том, нужно ли явно управлять созданной копией CVPixelBuffer? или swift позаботится об этом через счетчик ссылок?

1 Ответ

1 голос
/ 12 июня 2019

Swift управляет вашим буферным объектом, поэтому вам не нужно задумываться о его освобождении.

Объекты Core Foundation, возвращаемые из аннотированных API, автоматически управляются памятью в Swift - вам не нужнодля самостоятельного вызова функций CFRetain, CFRelease или CFAutorelease.

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/working_with_core_foundation_types#2994152

На самом деле не существует Swift-версии функции CVPixelBufferRelease.

https://developer.apple.com/documentation/corevideo/1563589-cvpixelbufferrelease

...