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 (在为borderColor set的行)。

它在debugging日志中说的是(lldb) 。 崩溃本身说:

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

这是我的故事板:

故事板

我该如何解决这个问题? 谢谢!

你有一个无限的recursion,这是导致崩溃。 基本上在borderColor的setter中,你调用setter来获得相同的属性,从而导致无限recursion。

发生这种情况是因为类扩展不允许存储属性,所以Swift不会为你的属性生成一个backstore,而是把它当作一个计算属性来处理,并且每当你尝试设置属性的时候调用setter。

现在有两种解决scheme可以解决您的问题:

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