iOS开发之懒加载
在iOS开发中几乎经常用到懒加载技术,比如我们存放网络数据的数组,控制器的view,控件的自定义,复杂的运算逻辑等等情况下都会用到懒加载技术,那么什么是懒加载呢?? 他又有什么样的优点呢??
懒加载:
- 也被成为延迟加载,可以做到用到时再加载
- 加载过了就不会再次加载,节约了系统资源
- 对于实际开发中可能会遇到的一些顺序问题,懒加载也能很好的解决
懒加载的实现思路:
- 1.在类扩展中创建一个属性
- 2.重写这个属性对应的getter,将要实现的逻辑放到这个getter中
- 3.考虑到懒加载只加载一次,那么在实现逻辑之前应该判断一下这个属性是否为空,为空才执行逻辑,否则直接返回这个属性
实例代码:
/** 用户*/
@interface LXBUserViewController()
@property (nonatomic,strong) NSMutableArray *users;
@end
- (NSMutableArray *)users
{
if (!_users) {
_users = [NSMutableArray array];
}
return _users;
}
我们以后要使用users数组出装数据的时候,我们直接:
[self.array addObjectsFromArray:(nonnull NSArray *)];
不用再关心users数组该在什么时候创建,我们只使用他就行了,
这样的话就是的程序会更加的简洁,提高了程序的可读性,也能降低程序的耦合性
主要的应用场景:
1.
@interface XMGTopicViewController ()
@property (nonatomic, strong) NSMutableArray *users;
@end
@implementation XMGTopicViewController
- (NSMutableArray *)topics
{
if (!users) {
users = [NSMutableArray array];
}
return _users;
}
// 加载网络数据
self.users = [LXBUsers objectArrayWithKeyValuesArray:responseObject[@"user"]];
2.用于初始化子控件
在实际开发中不管是通过xib还是纯代码我们都可能会在:
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// 添加子控件
}
return self;
}
初始化子控件,当要添加的子控件数目较多时我们就可以
单独抽取一个方法addChildView,在里面添加子控件,这样的话
- (instancetype)initWithFrame:(CGRect)frame方法
看起来就会比较简介,但是在addChildView中仍然是一堆代码,
可读性依然很差,此时我们就可以通过懒加载的方式去添加子控件,比如:
@interface LXBUserCell ()
@property (nonatomic,weak) UIButton *button1;
@property (nonatomic,weak) UIButton *button2;
@property (nonatomic,weak) UIButton *button3;
@property (nonatomic,weak) UIButton *button4;
@end
@implementation LXBUserCell
- (UIButton *)button
{
if (!_button) {
UIButton *button = [[UIButton alloc] init];
[self addSubview:button];
self.button = button;
}
return _button;
}
- (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会造成死循环