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