在UIColor子类中设置属性时崩溃

时间:2019-08-14 12:16:48

标签: ios swift crash uikit uicolor

我目前正在尝试创建UIColor的子类,因为出于我的目的,我需要使用几个属性来丰富它。一旦尝试在子类上设置任何自定义属性,该应用就会崩溃,并抛出EXC_BAD_ACCESS异常。这是预期的吗?我想念什么吗?

这是我尝试过的代码:

class MyColorClass: UIColor {

    var customProperty: String!

    convenience init(fromColor color: UIColor) {
        self.init(cgColor: color.cgColor)
        self.customProperty = "rgfgb" // crash
    }

}

MyColorClass(fromColor: UIColor.black)

示例游乐场:https://ufile.io/ejmrwst4

1 个答案:

答案 0 :(得分:0)

所以,在深入研究之后,我发现了以下内容:

发生了什么

因此,似乎很难将UIColor子类化,因为它是所谓的“类集群”的一部分。 This article很好地描述了它。

问题的要点在于,Apple内部有UIColor的几个(私有)子类,而UIColor本身被设计为抽象工厂类,它向您返回了一个具体的子类。苹果公司描述了所有here。因此,如果您将UIColor子类化,则某些功能会丢失,因为它不能直接使用。

解决方案

从理论上讲,可以创建类集群类的子类。 Apple在链接的文章中对此进行了描述。但是,这很痛苦,因为您需要实现UIColor中的所有方法,并将对它们的调用转发到有效的UIColor实例。另外,我无法设法使它与UIColor一起使用,因为它的某些必需的初始化程序是在扩展中定义的,您无法覆盖。

因此,最简单的方法是只创建一个包装UIColor属性的包装器类。这不能像子类那样优雅,因为您不能使用自定义类来代替UIColor,但是它可以工作:

class MyColor {

    var base: UIColor

    ....
}

let myColor = MyColor()
/* we can't use myColor as a UIColor, but have to use myColor.base instead */