iOS开发之懒加载

作者: coderboy001 | 来源:发表于2016-02-29 18:07 被阅读12343次

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数组该在什么时候创建,我们只使用他就行了,
这样的话就是的程序会更加的简洁,提高了程序的可读性,也能降低程序的耦合性

主要的应用场景:

@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会造成死循环

相关文章

  • iOS 数组 NSArray 遍历 懒加载总结

    iOS开发之懒加载 iOS中数组遍历的方法及比较

  • iOS开发之懒加载

    iOS开发之懒加载 在iOS开发中几乎经常用到懒加载技术,比如我们存放网络数据的数组,控制器的view,控件的自定...

  • Swift的懒加载和只读属性的介绍

    懒加载 在 iOS 开发中,懒加载是无处不在的 懒加载的格式如下: lazy var person: Person...

  • iOS开发之懒加载

    所谓的懒加载可以定义为:延时加载,即当对象需要用到的时候再去加载。其实就是所谓的重写对象的get方法,当系统或者开...

  • iOS 开发之懒加载

    1.懒加载基本 懒加载 -- 也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。所谓懒加载,写的是其ge...

  • 2018-12-21

    iOS开发中懒加载遇到的坑 正常写一个懒加载对象 - (MAMapView*)mapView{ if(nil=...

  • iOS开发之旅之懒加载

    在iOS开发摸爬打滚了许久,谈谈自己学习以及开发iOS的一些经验,文章比较随性,算是记录自己的成长吧!希望有些我走...

  • iOS开发之旅之懒加载

    在iOS开发摸爬打滚了许久,谈谈自己学习以及开发iOS的一些经验,文章比较随性,算是记录自己的成长吧!希望有些我走...

  • # 懒加载

    在 iOS 开发中,懒加载是无处不在的 懒加载的格式如下: 懒加载本质上是一个闭包 以上代码可以改写为以下格式 懒...

  • iOS开发-懒加载

    懒加载,⼜又称为延迟加载。说的通俗⼀一点,就是在开发中,当程序中需要 利⽤用的资源时。在程序启动的时候不加载资源,...

网友评论

  • Freedom_fly:self.button4 = button; 这种不会循环引用?
    宇文袥:@Freedom_fly 看情况
    Freedom_fly:@宇文袥 self. 不是调用的getter?
    宇文袥:这个self.button4调用的setter方法,当然不会循环引用
  • 卓敦:作者,如果懒加载创建控件,用[self.view addSubview:button];,这里用self会不会造成死循环
    AlanT:不会,就是要调用点语法才有get方法
  • 灯泡虫:可以试试懒加载的自动化插件,快速生成懒加载代码 http://www.jianshu.com/p/e6e6e10421aa
  • 崠崠:1、中的懒加载名称错了
  • stlndm:作者您好,这中代码风格很好,控件写在懒加载中,代码显得简洁美观.
    但是我目前想转Swift,请问Swift中这种空间懒加载怎么写?或者说怎么写才会显得很漂亮.
    Cc极生:swift里面用lazy修饰符
  • 洁简:Bool能写懒加载吗

本文标题:iOS开发之懒加载

本文链接:https://www.haomeiwen.com/subject/lcugkttx.html