oc和swift中的懒加载

2017-11-28  本文已影响87人  夏天爱西瓜汁

2017.2.17

在TableView的代理方法中,

- (NSInteger)tableView:(UITableView*)tableView   numberOfRowsInSection:(NSInteger)section{returnself.dataArray.count;}

这句 return self.dataArray.count;

其实就是利用

@property (nonatomic, strong) NSArray *dataArray;

@property的特性,为属性生成了get和set方法,而这里调用的get方法,但是上述代码中return self.dataArray.count会调用下面这句

- (NSArray *)dataArray {

return _dataArray

}

这样调用,如果成员属性dataArray开始没有复制的,那么在使用的时候,调用get方法,不重写的话,会报错,空指针,所以一般我们会重新get方法

//重写get方法- (NSArray *)dataArray{   if (nil == _dataArray){       _dataArray = [NSArray array];   }   return _dataArray}

这样就防止了成员属性没有赋值的情况

综上所述,oc的懒加载其实就是调用成员属性的get方法,初始化值,而swift的懒加载和oc不同

在swift存储属性必须初始化,确认类型,或者用可选类型,总之要确认类型,毕竟swift是类型安全语言,所以swift提出了lazy属性,用法如下

//1.分析 NSArray 是一个闭包的返回值,而这是一个没有参数的闭包lazyvardataArray:NSArray= {[]} ()//2.也可以写成这样 lazy var dataArray:NSArray = { return NSArray() }()//3.从plist文件加载lazyvardataArray:Array = {letwinePath =NSBundle.mainBundle().pathForResource("wine.plist", ofType:nil)!letwinesM =NSMutableArray(contentsOfFile: winePath);vartmpArray:Array! = []fortmpWineDictinwinesM! {varwine:XWWine=XWWine.wineWithDict(tmpWineDictas!NSDictionary)         tmpArray.append(wine)     }print("我就运行一次")returntmpArray }()

上述代码可以看成是一个代码块,然后self.dataArray的时候,就执行了代码块,但是重复调用,lazy属性的代码块只会调用一次,lazy修饰的是一个存储属性,儿存放的是闭包。

懒加载就是惰性初始化,即在变量第一次使用的时候才进行初始化

swift中有两种方式俩惰性初始化

1.简单表达式

lazy var first = NSArray(objects: "1", "2")

2.闭包

lazy var second:String = {

return "second"

} ( )

注意:

不要忘记最后的小括号。只有加了小括号,闭包才会在调用的时候立刻执行。

要类型声明lazy var second:String,这样Xcode会进行类型检查。

上一篇 下一篇

猜你喜欢

热点阅读