003-Swift进阶-属性-lazy
2020-12-16 本文已影响0人
Stronger_J
一、存储属性
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中是可选类型?
- 延迟存储属性并不能保证线程安全