懒加载,即延迟加载,需要的时候再加载到内存。
一次性加载数据,类似C语言中变量的定义,需要统一在函数体的最开始部分定义。iOS的设备的内存普遍不大,因此一次性加载会使程序运行缓慢。
懒加载,类似C++语言,灵活度更高,需要用到的时候再定义。而且有些数据在后期加载时,可能前面已经有些数据被释放了,内存会比之前一次性加载轻松。
同样的道理,iOS中大概有两种形式的懒加载:
- 数据的懒加载
- UI 控件的懒加载,这大部分是 iOS 的内部封装
这两种形式的懒加载的加载方式都是同一种,都是对属性的getter方法的重写。
01. // 数据的懒加载
02. // 1、定义一个存储数据对象的属性,例如加载plist文件
03. @property (nonatomic, strong) NSArray *array; //plist文件的数据一般加载到数组对象中,数组属性 -- strong
04. ...
05. // 2、实现getter方法的重写
06. - (NSArray *)array{
07. //判断扩展的成员是否为nil,即判断是否为首次懒加载,懒加载核心就是为了懒,当然对于加载操作做的越少越好
08. if(_array == nil) // 需要注意这里不能self.array == nil,会陷入死循环,很多时候还是要区分_array 和 self.array 的
09. {
10. // 具体见plist文件的读写
11. }
12. return _array; // 这里_array != self.array
13. }
14. ...
01. // UI 控件的懒加载
02. // iOS 内部的一个例子,表视图的单元格中的UIImageView,UILabel等
03. @property (strong, nonatomic) UIImageView *imageView;
04. @property (strong, nonatomic) UILabel *textLabel;
05. // 当然,这些被封装了,也不知道到底是不是,但感觉上如果是懒加载比较好
06. // 表视图的单元格由4种格式,并不是所有格式都需要图片控件的,因此感觉懒加载会更灵活
07. - (UIImageView *)imageView
08. {
09. if(_imageView == nil){
10. _imageView = [[UIImageView alloc] initWithFrame: ...];
11. ... // 图片控件的配置信息
12. }
13. return _imageView;
14. }