本篇是自己的首篇技术类文章,来谈一谈非常实用的懒加载技术。

首先感谢简书的 @维尼的小熊,他的许多技术文章对我的iOS学习提供了非常大的帮助。

懒加载的定义:

延时加载,即当对象需要用到的时候再去加载。其实就是重写对象的get方法,当系统或者开发者调用对象的get方法时,再去加载对象。
需要注意:重写get方法时,先判断对象当前是否为空,为空的话再去实例化对象

懒加载的优点:

  • 不需将对象的实例化写到viewDidLoad,可以简化代码,增强代码的可读性
  • 对象的实例化在get方法中,各司其职,降低耦合性
  • 对系统的内存占用率会减小
viewDidLoad正常加载代码示例

没用懒加载的时候,从plist获取数据,返回一个数组,需要写在viewDidLoad方法中获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@interface ViewController ()
@property (nonatomic, strong) NSArray *shopData;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_shopData = [NSArray arrayWithContentsOfFile:
[[NSBundle mainBundle] pathForResource:@"shop" ofType:@"plist"]];
}
@end

显而易见,当控制器被加载完成后就会加载当前的shopData,假如shopData是在某些事件被触发的时候才会被调用,没必要在控制器加载完就去获取plist文件,如果事件不被触发,代表着shopData永远不会被用到,这样在viewDidLoad中加载shopData就会十分多余,并且耗用内存

懒加载代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)viewDidLoad {
[super viewDidLoad];
}
- (NSArray *)shopData
{
if (!_shopData) {
_shopData = [NSArray arrayWithContentsOfFile:
[[NSBundle mainBundle] pathForResource:@"shop" ofType:@"plist"]];
}
return _shopData;
}
@end

当需要用到shopData的时候,就会调用[self shopData]的方法(即get方法),此时系统会去调用get方法,然后再get方法中获取plist文件内容,然后返回使用。

需要注意在get方法里切勿使用self.shopData,因为在这里使用self.shopData会造成死循环。
这里涉及到了Objective-C的点语法。self.shopData是方法调用,相当于[self shopData],也即调用了自身。
在Objective-C中,点方法放等号右边就是调用getter,放左边就是调用setter。

总结:懒加载即用到时方去加载对象