Search code examples
swiftcifilter

Subclassing CIFilter in Swift with input parameters crash


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
    }
}

Instantiating the above filter will cause the app to throw an exception CoreImage`-[CIFilter _crashed_when_dealloc_called_setValue_nil_forKey_probably_because_the_subclass_already_released_it:]:

Anyone know how to solve this?


Solution

  • Actually problem is: CoreImage tries to set all stored properties of CustomFilter to nil in runtime (I can not explain why). And as inputRadius is non-null - Core Image can not set it nil.

    So just use

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

    or help framework in runtime by overriding

    override func setNilValueForKey(key: String) {}
    

    UPD.

    With Swift 3.1 you can use code from the question with 1 small exception: you should correctly override name property:

    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
        }
    }