一般來說却特,在UIViewController里的UIView使用lazy var掏湾,可以確保在只第一次使用時創(chuàng)建。
但是如果在viewDidLoad()前訪問這個View调塌,那么這個View就會創(chuàng)建兩次逆害,說明Lazy var機制失效了头镊。網(wǎng)上搜了一下,都是說Lazy var在多線程下會失效魄幕。然而我打印一下日志相艇,兩次創(chuàng)建都是在主線程。
原因我猜測是UIViewController的創(chuàng)建采用了某種線程加速方法纯陨, 導致里面的方法有一些錯亂坛芽?
在viewDidLoad()前不要訪問里面的View留储,否則會導致莫名其妙難以排查的bug!
class NoSafeVC: UIViewController {
lazy var myView: UIView = {
let view = UIView(frame: view.bounds)
print("create myView \(view) \(Thread.current)")
return view
}()
init() {
super.init(nibName: nil, bundle: nil)
_ = myView // 提前訪問
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .gray
view.addSubview(myView)
}
}
create myView <UIView: 0x104b19730; frame = (0 0; 375 667); layer = <CALayer: 0x280fd1f40>> <NSThread: 0x281ae08c0>{number = 1, name = main}
create myView <UIView: 0x104b198a0; frame = (0 0; 375 667); layer = <CALayer: 0x280fd1fc0>> <NSThread: 0x281ae08c0>{number = 1, name = main}