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

ios 懒加载详解的更多相关文章

  1. Webpack探索【10】--- 懒加载详解

    本文主要讲懒加载方面相关内容.

  2. Javascript 异步加载详解

    Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...

  3. iOS 懒加载模式

    感谢: chengfang iOS开发-懒加载 1.懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否 ...

  4. IOS懒加载

    1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 ...

  5. iOS 懒加载不起作用的原因

    在.m类中定义了一共strong属性,用懒加载getter方式去处理,发现用的时候无论如何属性都是null,调试后,发现根本没进getter方法. (ps:懒加载,又称为延迟加载.说的通俗一点,就是在 ...

  6. iOS - (懒加载)

    今天很坑爹,做界面的时候,tableview 明显做了复用了,数组也做了懒加载了,获取数据前也把数组给清空了,但是每次获取数据刷新表格的时候,数据确重复覆盖了(重复创建),后来给 cell 加了个白色 ...

  7. iOS 懒加载 字典转模型

    >>>懒加载 一.介绍 懒加载又称延时加载,即在系统调用时加载,如果系统不调用则不会加载,所谓懒加载其实就是重写其get方法. 在使用懒加载时要先判断该方法是否存在,如果不存在再进行 ...

  8. Javascript图片预加载详解

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  9. WEB容器启动——web.xml加载详解

    最近在看spring的源码,关于web.xml文件在容器(Tomcat.JBOSS等)启动时加载顺序问题很混乱,通过搜集资料,得出以下的结论: 1.加载顺序与它们在 web.xml 文件中的先后顺序无 ...

随机推荐

  1. HDU-1074.DoingHomework(撞鸭dp二进制压缩版)

    之前做过一道二进制压缩的题目,感觉也不是很难吧,但是由于见少识窄,这道题一看就知道是撞鸭dp,却总是无从下手....最后看了一眼博客,才顿悟,本次做这道题的作用知识让自己更多的认识二进制压缩,并无其它 ...

  2. 上海高校金马五校赛 F题:1 + 2 = 3?

    链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言26214 ...

  3. 微信小程序——过滤器的模拟

    >> 编写wxs文件——filter.wxs //1. 价格格式化 function getPriceFormat(value) { return parseFloat(isNaN(val ...

  4. 【python】入门指南:控制语句

    条件控制 if,if-else,if-elseif-else #!/bin/python a = 'test' if a == 'test': print('a is %s' %(a)) else: ...

  5. freetype教程网址

    http://freetype.sourceforge.net/freetype2/docs/reference/ft2-system_interface.html#FT_Stream      ht ...

  6. 解决自定义classloader后无法使用maven install

    @上篇博客中探讨了web项目利用自定义classloader进行解密,利用的是编译后的文件直接运行程序一切正常 今天博主在探讨加密后进行混淆时,打包程序报程序包org.apache.catalina. ...

  7. Excel上传找到错误数据类型

    一:查询数据库表中字段的类型语句 SELECT CASE WHEN col.colorder = 1 THEN obj.name ELSE '' END AS 表名, col.colorder AS ...

  8. Eclipse中logcat过滤器的使用

    logcat里信息繁多,用过滤器可以方便快捷的找到我们要查找的信息. 我们可以在打开Eclipse之后,选择Window –> Show View ->Other菜单,然后在Android ...

  9. C++中强制类型转换

    C++强制类型转换 C++中的强制类型转换虽然兼容C语言中的强制类型转换.但是并不建议在C++中使用C语言风格的强制类型转换.C++中的强制类型转换共有4个关键字分别是:static_cast,con ...

  10. (转)silverlight应用程序中未处理的错误代码:2104 类别:InitializeError

        解决方案:第一步:默认网站--属性-----http头 第二步:点击mime类型: 第三步:点击新建: 第四步:输入扩展名以及类型: (1) 扩展名:.xaml MIME类型:applicat ...