在UI中,使用懒加载,也就是延迟加载来加载数据的时候,总是会面临几个问题?

如:1. >为什么先创建NSArray属性?

2. >为什么重写NSArray的get方法?

3.>为什么要判断是否为空?

4.>为什么下方代码"//1"这里不用NSString stringWithFormat: 而"//2"这里要使用?

5.>同时"//2"这里为什么使用的是%ld 来作为占位符?

这些问题不搞懂,懒加载就很难通透,  代码如下:

1 #import "ViewController.h"
2
3 @interfaceViewController ()4 //先创建一个属性  (因为需要加载由字典组成的这个数组(也就是plist文件),所以需要先定义数组属性来接收和表示,)
5 @property (nonatomic, strong) NSArray *pictures;6 @end
7
8 @implementationViewController9
10 //.重写pictures属性的get方法, 在该属性的get方法中读取images.plist文件中的数据, 并将数据设置给pictures属性11 //这种加载数据的方式就叫做"懒加载"
12 - (NSArray *)pictures {13     if (_pictures ==nil) {14         //读取plist文件并加载数据15         //1. 获取images.plist文件的完整的路径
16         NSString *path = [[NSBundle mainBundle] pathForResource:@"images.plist"ofType:nil];17         //2. 根据plist文件的路径, 加载plist文件,再赋值给数组
18         _pictures =[NSArray arrayWithContentsOfFile:path];19 }20     return_pictures;21 }22 @end
23
24  //封装一个修改界面控件数据的方法
25 - (void)loadData {26     //2. 取出当前self.pictures中的对应的数据
27    NSDictionary *dict =self.pictures[self.index];28
29     //3. 把数据设置到界面中对应的控件上
30    self.lblTitle.text = dict[@"desc"];  // 1
31    self.imgViewIcon.image = [UIImage imageNamed:dict[@"icon"]];32    self.lblIndex.text = [NSString stringWithFormat:@"%d / %ld", self.index + 1, self.pictures.count];   //233
34
35     //设置"上一张"按钮 和 "下一张" 按钮的状态
36    self.btnPrevious.enabled = (self.index <= 0) ?NO : YES;37    self.btnNext.enabled = (self.index >= self.pictures.count - 1) ?NO : YES;38 }

原因及bug解析:

1.>为什么先创建NSArray属性?
因为需要加载由字典组成的这个数组(也就是plist文件),所以需要先定义数组属性来接收和表示,
2. >为什么重写NSArray的get方法?
因为在程序运行的时候,当需要读取这个数组的数据时,此时NSArray这个数组里面是空的,空的数组是没法满足我们的需求的,所以,我们这里就拦截这个get方法,重写它,将需要的数据加载进去,这样下面运行的时候,就会有我们需要的数据了
3.>为什么要判断是否为空?
因为程序运行时,第一次访问为空,而第二次访问就已经加载了,不为空了,所以需要判断 if (_pictures == nil),这样就避免了重复加载数据
4.>易错点bug: 为什么代码"//1"这里不用NSString stringWithFormat: 而"//2"这里要使用?
解析:
NSDictionary *dict=self.picture[self.index];
self.jieshaoLabel.text=dict[@"desc"];
第一种解释:这里使用的就是里面的属性, 所以可以直接用,
//dict[@"desc"]==等效于[NSString stringWithFormat:@"%@",dict[@"desc"]];
第二种解释:  因为这里直接就可以引用字典中的键值对的数据了,而下面的self.suoyinLabel.text需要拼接组合数据,需要通过调用其他的属性来组成,所以需要用;
5.>"//2"这里为什么使用的是%ld 来作为占位符?
@"%ld” ,self.picture.count;    
这里是很多人都容易忽视的,所以也比较容易出现错误,
解析:
首先我们来看看count这个属性的底层实现:
@property (readonly) NSUInteger count;
从这个底层我们可以看得出,count是一个NSUInteger类型的,
而NSUInteger的底层又是什么呢? 我们来看看:如下:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64

typedef long NSInteger;

typedef unsigned long NSUInteger;

#else

typedef int NSInteger;

typedef unsigned int NSUInteger;

#endif

可以看出,NSUInteger就是一个别名,而且是两种情况,

那就是如果你的设备是32位的,那么这个NSUInteger表示的就是给unsigned long取的一个别名,

那就是如果你的设备是64位的,那么这个NSUInteger表示的就是给 long取的一个别名,

所以,在使用过程中,我们首先要确定的就是当前编译器环境是处于32位,还是64位环境中,只有确定了这一步,这个bug才能避免!

转载于:https://www.cnblogs.com/anRanTimes/p/5035881.html

懒加载(延迟加载)之后,在使用数据过程中容易出现的bug相关推荐

  1. 解决hibernate中的懒加载(延迟加载)问题

    解决hibernate中的懒加载(延迟加载)问题 我们在开发的时候经常会遇到延迟加载问题,在实体映射时,多对一和多对多中,多的一样的属性默认是lazy="true"(即,默认是延迟 ...

  2. 图片懒加载、ajax异步调用数据、lazyload插件的使用

    关于这个效果还是很简单的,样式部分我就不多说了,我就简单的写了一下布局, 这是css样式 我们先说一下实现的原理. 我们都知道在于图片的引入,我们都是用src来引入图片地址.从而实现图片的显示.那我们 ...

  3. 如何使用echo.js实现图片的懒加载(整理)

    如何使用echo.js实现图片的懒加载(整理) 一.总结 一句话总结:a.在img标签中添加data-echo属性加载真实图片:<img class="loading" sr ...

  4. WEB前端 实现图片懒加载 echo.js

    echo.js是一个轻小的图片懒加载js插件,在使用过程中很多朋友可能是直接自定义一张占位图片,可能会造成图片的变形等.其实这并不是最佳的解决方案.下面给大家介绍另一种方法,简单的控制下css,实现l ...

  5. LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据

    LayUi框架中树形组件tree官方还在持续完善中,目前最新版本为v2.5.5 官方树形组件目前还不支持懒加载方式,我自己修改了下最新源码tree.js,简单粗暴的方式支持懒加载模式.(Ps:最新更新 ...

  6. mysql 懒加载数据_jpa如何懒加载大字段,懒加载之后又如何获取懒加载字段

    前言:对于大字段,我们在查询列表的时候不需要查询,但是修改的时候有需要展示大字段内容,怎么办 问1.jpa如何懒加载大字段?即查询列表的时候不查询出来 问2.懒加载之后又如何获取懒加载字段.比如,在后 ...

  7. 图片预加载与图片懒加载

    图片预加载与图片懒加载 图片预加载 图片预加载主要是针对非icon类图片. 加载快,有良好的用户体验. 提前加载图片,当用户需要查看时可直接从本地缓存中渲染.可能因为图片很大,浏览器显示出它会用很长的 ...

  8. JavaScript中的懒加载——概念,作用,原理,实现步骤,以及3种原生js实现方式

    1.什么是懒加载? 懒加载也就是延迟加载. 当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图), 只有当图片出现在浏览 ...

  9. Androidx ViewPager+Fragment 懒加载

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/113545036 本文出自[赵彦军的博客] 目录 前言 懒加载(预加载) 传统模式 ...

最新文章

  1. Datawhale厦门大学分享记录!
  2. android获取指针空间大小_腾讯笔试题:浅谈计算机中cpu位数和指针
  3. BCI2000对win10的支持
  4. python学习笔记(二十八)日志模块
  5. 一本让我多花2倍时间读的书
  6. c++代码整洁之道pdf_别再问如何用python提取PDF内容了
  7. 特斯拉全球超级充电站已超过25000座 国内超过870座
  8. 数据挖掘与python实践心得体会_数据挖掘心得体会
  9. RH850F1L 移植freeRTOS
  10. SLAM大牛实验室汇总(转载)
  11. 计算机主板巨头,主板主要厂商
  12. 计算机怎么显示正确,电脑显示器怎么正确设置
  13. 星球矿石盲盒流量主小程序
  14. php odbc informix,Informix CLI 与 ODBC
  15. Word中插入表格与柱状图饼状图技术经验分享
  16. 流利阅读 2019.1.26 The maturing of the smartphone industry should be celebrated, not lamented
  17. 因为1024图片 AppIcon 图标包含了透明度导致app上传ios 代码报错
  18. SAP QM检验批常见问题及解决办法
  19. Linux攻关之基础模块十 特殊权限
  20. webview加载gif图片

热门文章

  1. 看我!挖到了一个3万美元的 Instagram 漏洞
  2. 认识下这位全能型漏洞猎人
  3. 谷歌修复安卓System 组件中的多个 RCE 漏洞
  4. cookie和session的使用和区别
  5. 安装labelImg
  6. linux 比较两个文件夹不同 (diff命令, md5列表)
  7. http 和 https 区别?
  8. oracle中的rownum
  9. 【Vegas原创】ProC环境搭建
  10. 能打开java文件的软件有哪些_使用JAVA打开本地应用程序相关的文件