lazy var使用失效
一般来说,在UIViewController里的UIView使用lazy var,可以确保在只第一次使用时创建。
但是如果在viewD
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失效的资料请关注好代码网其它相关文章!