Swift基础-懒加载(或称延迟存储)

1. swift中也有懒加载的方式
    1. (苹果的设计思想:希望所有的对象在使用时才真正加载到内存中)
2. 和OC不同的是swift有专门的关键字来实现懒加载
3. lazy关键字可以用于定义某一个属性懒加载

懒加载的使用

  1. 格式
lazy var 变量: 类型 = { 创建变量代码 }()
  • 懒加载的使用
    // 懒加载的本质是,在第一次使用的时候执行闭包,将闭包的返回值赋值给属性
    // lazy的作用是只会赋值一次
    lazy var array : [String] = {
        return ["why", "lmj", "lnj"]
    }()

延迟存储属性

1. 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用lazy来标示一个延迟存储属性
2. 最常见的延迟存储属性
    1. 执行某个方法返回处理好的数据
    2. 执行某个闭包返回处理好的数据
3. 注意
    1. 必须将延迟存储属性声明成变量(使用var关键字),因为属性的初始值可能在实例构造完成之后才会得到。而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性
    2. 如果一个被标记为lazy的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次
// 推荐写法
    lazy var listData: [String] = {
        print("执行了")
        return ["lmj", "lnj", "zs"]
    }()

// 等价于:
    lazy var listData: [String] = self.test()
    func test() -> [String] {
        print("执行了")
        return ["lmj", "lnj", "zs"]
    }

// 等价于:
    lazy var listData: [String] = {
        ()->[String] in
        print("执行了")
        return ["lmj", "lnj", "zs"]
    }()

// 等价于:
    lazy var listData = {
        ()->[String] in
        print("执行了")
        return ["lmj", "lnj", "zs"]
    }()

// 下述情况无法保证只被初始化1次
    override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
        print(listData)
        print(listData)
        print(listData)
    }

你可能感兴趣的:(Swift基础-懒加载(或称延迟存储))