lazy顾名思义就是慢吞吞的,万非得一就不动。
那么一个变量也是如此,只有你第一次使用的时候才进去加载。所有又称为延迟加载,需要的时候才加载。
=========
这样做的好处:
1. 模块化,把对象的代码都写在了get方法中,代码的可读性更强。
2. 占用内存小【在某些情况下,不一定该对象一定要创建】,按需加载
=======
如何体现?
1.oc:
- (UITableView *)tableView{
if(!_tableView){
_tableView = [[UITableView alloc] init];
}
return _tableView;
}// 只有第一次调用self.tableView的时候会_tableView才会被创建
2.swift:
2.1 简单的表达式:lazy var dataArr = Array<Product>()
2.2 闭包:lazy var titleStr:String = {return "title"}()
============
使用的例子:
1. 需要对属性进一步加工才能使用
class LazyDemo {
var url:String
lazy var requestUrl:String = {
[unowned self] in
if self.url.hasPrefix("http://"){
return self.url
}else{
return "http://".stringByAppendingString(self.url)
}
}()
init(url:String){
self.url = url
}
}
2. 需要复杂计算
lazy var second:Int = {
var sum = 0
for i in 1...100000{
sum += i
}
return sum
}()
3. 属性不确定是否会被使用:例子来源官网
class DataImporter {
/*
DataImporter is a class to import data from an external file.
The class is assumed to take a non-trivial amount of time to initialize.
*/
var fileName = "data.txt"
// the DataImporter class would provide data importing functionality here
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
// the DataManager class would provide data management functionality here
}
let manager = DataManager()
manager.data.append("Some data") // 这个时候才初始化 importer
manager.data.append("Some more data")