懒加载 - lazy

作者: 介和 | 来源:发表于2019-03-02 22:46 被阅读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 中一定注意不要主动清理视图或者控件

        // 因为懒加载不会再次创建

    }

}

相关文章

网友评论

    本文标题:懒加载 - lazy

    本文链接:https://www.haomeiwen.com/subject/pfkuuqtx.html