在Swift中使用输入参数崩溃对CIFilter进行子类化

时间:2016-02-16 03:40:51

标签: swift cifilter

class CustomFilter : CIFilter {
    var inputImage: CIImage?
    var inputRadius: CGFloat = 100.0

    override var name: String {
        return "CustomFilter"
    }

    override func setDefaults() {
        self.inputRadius = 100.0
    }

    override var outputImage: CIImage? {
        return nil
    }
}

实例化上述过滤器会导致应用程序抛出异常 CoreImage`-[CIFilter _crashed_when_dealloc_called_setValue_nil_forKey_probably_because_the_subclass_already_released_it:]:

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

实际问题是:CoreImage尝试在运行时将CustomFilter的所有存储属性设置为nil(我无法解释原因)。并且由于inputRadius为非null - Core Image无法将其设置为nil。

所以只需使用

var inputRadius: NSNumber? // (don't use CGFloat?)

或通过覆盖

在运行时帮助框架
override func setNilValueForKey(key: String) {}

<强> UPD。

使用Swift 3.1,您可以使用问题中的代码,但有一个小例外:您应该正确覆盖name属性:

class CustomFilter : CIFilter {
    var inputImage: CIImage?
    var inputRadius: CGFloat = 100.0
    override var name: String {
        get { return "CustomFilter" }
        set { }
    }
    override func setDefaults() {
        super.setDefaults()
        self.inputRadius = 100.0
    }

    override var outputImage: CIImage? {
        return nil
    }
}