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 中一定注意不要主动清理视图或者控件
// 因为懒加载不会再次创建
}
}
lazy
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 单例 Log 输出 lazy 修饰符和 lazy 方法 单例 单例是一个在 Cocoa 中很常用的模式了。对于一些...
- 1,懒加载的写法 2,lazy修饰方法 另外一个不太引起注意的是,在 Swift 的标准库中,我们还有一组 laz...