Swift CoreImage保留内存

时间:2016-03-27 00:34:31

标签: ios swift core-image reactive-cocoa core-video

我使用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本身的一个错误吗?

0 个答案:

没有答案