Быстрое использование памяти закрытия - PullRequest
0 голосов
/ 24 сентября 2018

Использование замыкания приводит к тому, что отладчик завершает работу с давлением памяти и приложение из-за проблем с памятью.Вот простое замыкание, которое я определяю и передаю в качестве аргумента различным функциям.Давление памяти исчезает, если я заменяю замыкание двумя строками кода в замыкании там, где это необходимо.Будут ли эти замыкания, переданные функции, сохранять outputPixelBuffer или sampleBuffer, передаваемые в аргументах, неограниченное время?

let videoProcessor: (CMSampleBuffer, CVPixelBuffer) throws -> Void = { (sampleBuffer, outputPixelBuffer) in
    if let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer), CFGetTypeID(imageBuffer) == CVPixelBufferGetTypeID() {
        do {
            try delegate.processPixelBuffer(self, inputPixelBuffer: imageBuffer, toPixelBuffer: outputPixelBuffer)
        } catch {
            fatalError("Failed processing pixel buffer")
        }
    }
}

1 Ответ

0 голосов
/ 24 сентября 2018

Вы фиксируете сильную ссылку на себя, вызывая цикл.Добавьте список захвата - [слабое я] перед параметрами замыкания, затем внутри вы можете включить

let strongself = self

и затем заменить все ссылки на себя (даже в настоящее время неявные) на strongself.Я не на устройстве, где я могу легко отредактировать ваш код, но это должно сделать это.

...