Swift CoreImage Сохранение памяти
Я использую ReactiveCocoa и CoreImage/Video для обработки видео, CoreImage для преобразования и фильтрации каждого CMSampleBuffer
из видео и ReactiveCocoa для последовательной обработки буферов.
Моя функция фильтрации довольно проста; все, что я делаю, - это обнаружение лица на заданном изображении и обрезка изображения до границ лица.
static func process(input: CIImage) -> SignalProducer<CIImage?, Types.Error> {
return SignalProducer { observer, disposable in
let context = CIContext()
let detector = CIDetector(ofType: CIDetectorTypeFace, context: context, options: nil)
guard let firstFeature = detector.featuresInImage(input, options: [CIDetectorImageOrientation: NSNumber(integer: 6)]).first else {
observer.sendNext(nil)
observer.sendCompleted()
return
}
let cropFilter = CIFilter(name: "CICrop")
let cropRect: CIVector = CIVector(CGRect: firstFeature.bounds)
cropFilter?.setValue(input, forKey: "inputImage")
cropFilter?.setValue(cropRect, forKey: "inputRectangle")
guard let output = cropFilter?.outputImage else {
observer.sendNext(nil)
observer.sendCompleted()
return
}
observer.sendNext(output)
observer.sendCompleted()
disposable.addDisposable {
cropFilter?.setValue(nil, forKey: "inputImage")
}
}
}
Однако где-то в этой функции память непреднамеренно сохраняется. Если я заверну внутренний блок SignalProducer в autoreleasepool
Скажите, все работает нормально, и мое использование памяти никогда не превышает 50 МБ. Но если я не заверну свой фильтрующий код в этом, память перепрыгнет с 30 МБ до 200 МБ, тогда приложение вылетает.
Что сохраняется и какая линия вызывает это?
РЕДАКТИРОВАТЬ:
Я обнаружил это вскоре после этой строки:
guard let firstFeature = detector.featuresInImage(input, options: [CIDetectorImageOrientation: NSNumber(integer: 6)]).first else {
observer.sendNext(nil)
observer.sendCompleted()
return
}
Хотя, почему именно эта строка, я понятия не имею. Может ли это быть ошибкой в самом CoreImage?