EXC_BAD_ACCESS使用IBInspectable

时间:2016-08-29 00:30:15

标签: ios swift exc-bad-access ibinspectable

我正在尝试使用IBInspectable为我的观点添加边框。

extension UIView {

    private func getBorder(integer: Int) -> UIRectEdge {
        if integer == 1 {
            return .top
        } else if integer == 2 {
            return .left
        } else if integer == 3 {
            return .right
        } else if integer == 4 {
            return .bottom
        }
        return .all

    }

    @IBInspectable var border: Int? {
        get {
            return self.border
        }
        set (value) {
            self.border = value
            for v in addBorder(edges: self.getBorder(integer: self.border!)) {
                self.addSubview(v)
            }
        }
    }

    @IBInspectable var borderColor: UIColor? {
        get {
            return self.borderColor
        }
        set (value) {
            self.borderColor = value //EXC_BAD_ACCESS here
            for v in addBorder(edges: self.getBorder(integer: self.border!), color: borderColor!) {
                self.addSubview(v)
            }
        }
    }

    private func addBorder(edges: UIRectEdge, color: UIColor = UIColor.white, thickness: CGFloat = 1) -> [UIView] {
        ...
    }
}

崩溃发生在self.borderColor = value行上(set的{​​{1}})。

调试日志中的所有内容都是borderColor。崩溃本身说:

  

线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7fff53cc5fe8)

这是我的故事板:

storyboard

如何解决此问题?谢谢!

1 个答案:

答案 0 :(得分:1)

你有一个无限递归,导致崩溃。基本上在borderColor的setter中你调用同一属性的setter,导致无限递归。

这是因为类扩展不允许存储属性,因此Swift不会为您的属性生成反向存储,而是将其视为计算属性,并在您尝试设置属性时调用setter。 / p>

目前我能想到两种解决方案,可以解决您的问题:

  1. 子类UIView,在那里添加两个属性,更新IB中的类以匹配新类的名称。
  2. UIView访问者(objc_setAssociatedObject() / objc_getAssociatedObject())中使用相关对象,而不是直接使用iVar参考。你不需要子类化和更新你的xib,但是这个解决方案比第一个解决方案有点麻烦。