1.示例
// 写在控制器里面
// static 静态的类属性,在程序运行中只初始化一次,在内存只有一份,本质就是全局变量
static var height: Int = getHeight()
static func getHeight() -> Int {
print("getHeight")
return 0
}
// 多次调用只打印一次,就算控制器销毁,在此进来控制器,也不会打印了
let _ = Self.height
let _ = Self.height
let _ = Self.height
2.示例
// 写在控制器里面
// 使用闭包声明存储属性
static var age: Int = {
print("这个是打印")
return 20
}()
// 多次调用只打印一次,就算控制器销毁,在此进来控制器,也不会打印了
let _ = Self.age
let _ = Self.age
let _ = Self.age
3.示例
// 写在控制器外面,全局变量
var onceTask: Void = {
print("这个是打印")
}()
// 多次调用只打印一次,就算控制器销毁,在此进来控制器,也不会打印了
let _ = onceTask
let _ = onceTask
let _ = onceTask
4.示例
// 就算这个控制器销毁,再次进来控制器,这个headView属性仍然是原来的那一份,打印地址可以对比
lazy var headView: UIView = {
let head = UIView.init()
head.frame = CGRect.init(x: 0, y: 0, width: 100, height: 100)
return head
}()
一旦使用lazy var closure这种闭包的存储属性,相当于是全局变量,在程序运行过程中它的地址就不会变了,所以,不建议使用这种方法声明属性,一旦生成变无法销毁,除非程序退出.
实际上,也是执行了dispatch_once函数,如图