有时候看别人代码,会刻意观察代码的优缺点,取长补短,学无止境。其中善于使用懒加载就是非常值得关注的技术。在iOS开发中会经常用到或看到懒加载技术,比如存放网络数据的数组,控制器的view,控件的自定义,复杂的运算逻辑等等情况下都可能会用到懒加载。接下来说明一下什么是懒加载,以及懒加载的实现思路。
懒加载(Load On Demand)是一种独特而又强大的数据获取方法,也会被称为延迟加载,能够达到用时再加载的效果;而且加载过以后就不会再次加载,这样就节约了系统资源。所以说,勤用懒加载是有很大的好处的。
懒加载的实现思路:
①:在类扩展中创建一个属性;
②:重写这个属性对应的getter,将要实现的逻辑放到这个getter方法中;
③:考虑到懒加载只加载一次,那么在实现逻辑之前应该判断一下这个属性是否为空,为空才执行逻辑,否则直接返回这个属性。
举个实例,给ViewController添加cars数组属性:
@interface ViewController()
@property (nonatomic,strong) NSMutableArray *cars;
@end
- (NSMutableArray *)cars
{
if (!_cars) {
_cars = [NSMutableArray array];
}
return _cars;
}
我们可以不再关心cars数组什么时候去创建,直接使用就可以了,如果cars数组已经存在,就直接拿来用,如果不存在,就先创建再拿来用,这样就使程序更加的简洁,提高了程序的可读性,也能降低程序的耦合性!
//直接使用cars数组
[self.cars addObjectsFromArray:someArray];
当界面中需要添加的子控件数量比较多的时候,就更应该使用懒加载的方式去添加子控件,不仅清晰明了,操作也会更加方便,官方也推荐多使用懒加载,错不了的。
//cell中添加多个button
@interface LGLCell ()
@property (nonatomic,weak) UIButton *button1;
@property (nonatomic,weak) UIButton *button2;
@property (nonatomic,weak) UIButton *button3;
@property (nonatomic,weak) UIButton *button4;
@end
@implementation LXBUserCell
- (UIButton *)button1
{
if (!_button1) {
UIButton *button = [[UIButton alloc] init];
[self addSubview:button];
self.button1 = button;
}
return _button1;
}
- (UIButton *)button2
{
if (!_button2) {
UIButton *button = [[UIButton alloc] init];
[self addSubview:button];
self.button2 = button;
}
return _button2;
}
- (UIButton *)button3
{
if (!_button3) {
UIButton *button = [[UIButton alloc] init];
[self addSubview:button];
self.button3 = button;
}
return _button3;
}
- (UIButton4 *)button4
{
if (!_button4) {
UIButton *button = [[UIButton alloc] init];
[self addSubview:button];
self.button4 = button;
}
return _button4;
}
注意:很多人都习惯了objc中的点语法,点语法用于方便的通过属性的setter,getter去操作成员变量,但是在懒加载的编写过程中应用点语法时一不小心可能会导致程序进入死循环。比如:
- (NSMutableArray *)users // 1部分
{
if (!_users) { // 2部分
_users = [NSMutableArray array]; // 3部分
}
return _users; // 4部分
}
第一部分:self.users是一个getter
第二部分:不能写成 !self.users 这也是一个getter,getter中有getter会造成死循环
第三部分:可以使用self.users,这是一个setter
第四部分:不能使用self.users,这也是一个getter,getter中有getter会造成死循环