lazy var使用失效
一般来说,在uiviewcontroller里的uiview使用lazy var,可以确保在只第一次使用时创建。
但是如果在viewdidload()前访问这个view,那么这个view就会创建两次,说明lazy var机制失效了。网上搜了一下,都是说lazy var在多线程下会失效。然而我打印一下日志,两次创建都是在主线程。
原因分析
原因我猜测是uiviewcontroller的创建采用了某种线程加速方法, 导致里面的方法有一些错乱?
在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}以上就是ios swift lazy var view失效问题解决的详细内容,更多关于ios swift lazy var view失效的资料请关注代码网其它相关文章!
发表评论