lazy
2019-04-30 本文已影响0人
愤怒小鸟飞呀飞
class ViewController: UIViewController {
var label: DemoLabel?
// 初始化并且分配空间 label, 会提前创建
// 在移动端开发, 延迟加载 减少内存消耗
// 懒加载 - lazy
/*
1. 能够延迟创建
2. 最大的好处, 可以解除解包的烦恼
*/
// lazy var label2: DemoLabel = DemoLabel()
// 懒加载本质上是一个 闭包
// 懒加载会在第一次访问的时候执行, 闭包执行结束后, 会把结果保存在 属性 中
// 后续调用, 直接返回 属性 的内容
// 懒加载的属性会分配空间, 存储值
// 只要调用过一次, 懒加载后面的闭包再也不会执行了
// 完整写法
/*
{} 包装代码
() 执行代码
日常开发:
1. 闭包中的智能提示不好
2. 闭包中如果出现 self. 还需要注意循环引用
*/
lazy var label2 = { () -> DemoLabel in
let l = DemoLabel()
// 设置 Label 的属性...
return l
}()
// 注意: 一旦 label 被设置为 nil, 懒加载也不会再次执行
// 懒加载的代码只会在第一次调用的时候, 执行闭包, 然后将闭包的结果保存在 label 的属性中
private lazy var label3: UILabel? = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
// 设置 UI
setupUI()
label3?.text = "hello"
label3?.sizeToFit()
print(label3 as Any)
label3 = nil
print(label3 as Any)
}
private func setupUI()
{
// 1. swvf控件
label = DemoLabel()
// 添加到视图
// ! 解包, 为了参与计算, addSubView 用 subViews 数组记录控件, 数组中不允许加入 nil
// ? 可选解包, 调用方法, 如果为 nil, 不调用方法, 但是不能参与计算
view.addSubview(label!)
label?.text = "hello"
label?.sizeToFit()
label?.center = view.center
}
override func didReceiveMemoryWarning()
{
// Swift 中一定注意不要主动清理视图或者控件
// 因为懒加载不会再次创建
}
}