003-Swift进阶-属性-lazy

一、存储属性

1、属性存储

class LJTest{
    var age = 18
    var name: String = "swift"
}
var t1 = LJTest()
print(class_getInstanceSize(LJTest.self))  //40字节(8 + 8 + 8 + 16)
image.png

2、延迟属性 lazy
延时加载存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用 lazy 来标示一个延时加载存储属性。
<font color=red>注意:</font>必须将延时加载属性声明成变量(使用 var 关键字),因为属性的初始值可能在实例构造完成之后才会得到。而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延时加载。

lazy var age = 18 //正确
lazy let age = 18 //错误

//对应sil
class LJTest {
  lazy var age: Int { get set }
  @_hasStorage @_hasInitialValue final var $__lazy_storage_$_age: Int? { get set }
  @_hasStorage @_hasInitialValue var age1: Int { get set }
  @_hasStorage @_hasInitialValue var name: String { get set }
  @objc deinit
  init()
}
  • lazy修饰是必须有一个初始值
  • lazy只有在第一次被调用是才会被初始化


    image.png

    sil分析:


    image.png
  • lazy修饰会增加8字节的大小
  • 可以看到lazy延迟属性在sil中是可选类型?
  • 延迟存储属性并不能保证线程安全
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容