我使用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")
}
}
}
但是,此函数内存中的某处无意中被保留。如果我在autoreleasepool
语句中包装内部SignalProducer块,一切正常,我的内存使用量永远不会超过50 MB。但如果我没有将过滤代码包装在内,那么内存会从30MB跳到200MB,然后应用程序崩溃。
保留了哪些内容以及导致该内容的哪一行?
编辑:
我发现很快就出现了这条线:
guard let firstFeature = detector.featuresInImage(input, options: [CIDetectorImageOrientation: NSNumber(integer: 6)]).first else {
observer.sendNext(nil)
observer.sendCompleted()
return
}
虽然至于为什么这条线,但我不知道。这可能是CoreImage本身的一个错误吗?