先看一下踩坑的代码:
public class MyView: UIView {
private var count = 0
public init(count: Int) {
super.init(frame: .zero)
self.count = count
}
// 重写 setFrame 方法
override public var frame: CGRect {
didSet {
let w = frame.width * count
}
}
}
以上示例中,count
属性是在 super.init(frame:)
之后才赋值,
但是由于重写了 frame
属性的 didSet
方法,而且在其中使用到了 count
属性,
这样就导致了一个隐含的 BUG:在初始化方法中触发的 frame 的 didSet
方法里使用的 count
属性的值是 0
而不是外部传进来的值。
要避免这类问题发生,推荐的做法是在调用任何的 super.init
初始化方法之前先给属性赋值。
修正后的代码:
public class MyView: UIView {
private var count = 0
public init(count: Int) {
self.count = count // 在 super.init 之前先赋值
super.init(frame: .zero)
}
// 重写 setFrame 方法
override public var frame: CGRect {
didSet {
let w = frame.width * count
}
}
}