gpt4 book ai didi

ios - EXC_BAD_ACCESS 使用 IBInspectable

转载 作者:行者123 更新时间:2023-11-28 16:14:58 32 4
gpt4 key购买 nike

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

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 行(在 borderColorset 中)。

它在调试日志中所说的只是(lldb)。崩溃本身说:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x7fff53cc5fe8)

这是我的 Storyboard:

storyboard

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

最佳答案

你在那里有一个无限递归,这是导致崩溃的原因。基本上在 borderColor 的 setter 中,您为同一属性调用 setter,从而导致无限递归。

发生这种情况是因为不允许类扩展具有存储属性,因此 Swift 不会为您的属性生成后备存储,而是将其视为计算属性,并在您尝试设置属性时调用 setter。

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

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

关于ios - EXC_BAD_ACCESS 使用 IBInspectable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39197048/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com