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

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

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

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

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

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

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

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

 1 #import "ViewController.h"
 2
 3 @interface ViewController ()
 4 //先创建一个属性  (因为需要加载由字典组成的这个数组(也就是plist文件),所以需要先定义数组属性来接收和表示,)
 5 @property (nonatomic, strong) NSArray *pictures;
 6 @end
 7
 8 @implementation ViewController
 9
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];   //2
33
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才能避免!

时间: 2024-10-12 12:53:45

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

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

解决hibernate中的懒加载(延迟加载)问题 我们在开发的时候经常会遇到延迟加载问题,在实体映射时,多对一和多对多中,多的一样的属性默认是lazy="true"(即,默认是延迟加载), 如:<many-to-one name="parent" class="Department" column="parentId" lazy="true"/> 延迟加载表现在:比如:我们要查询id为2的部门数

lazy懒加载(延迟加载)UITableView

举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要滑动经过了,图片就开始加载了,这样用户体验就不太好,而且浪费内存. 这个时候,我们就可以利用lazy加载技术,当界面滑动或者滑动减速的时候,都不进行图片加载,只有当用户不再滑动并且减速效果停止的时候,才进行加载. 刚开始我异步加载图片利用SDWebImage来做,最后试验的时候出现了重用bug,因为虽然SDWebImage实现了异步加载缓存,当加载

smartjs - DataManager 场景示例分析 - 数据懒加载

发一张policy的参数图设置图: 场景1 - 数据的懒加载/延迟加载 在很多时候,为了提高网页的加载速度,减少不必要的开销,会将页面的数据拆分成几个部分,首先加载呈现可视区域内的数据,然后剩下来的会在需要的时候在进行加载. 而这种按需加载的数据又分为两种: 1.按照需要进行加载:可以是由某个动作触发来引起,比如:tab,查看更多等: 2.采用缓存的方式:对后续动作的预知,提前将后续的数据加载进来,放入到缓存中:等需要的时候能提供快速的响应:比如:很多igrid的滚动分页 那么来看一下在data

深入懒加载

[javascript] view plain copy 懒加载(LazyLoad)一直是前端的优化方案之一.它的核心思想是:当用户想看页面某个区域时,再加载该区域的数据.这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度. 懒加载多用于图片,因为它属于流量的大头.最典型的懒加载实现方案是先将需要懒加载的图片的src隐藏掉,这样图片就不会下载,然后在图片需要呈现给用户时再加上src属性. 公司内部库的懒加载正是采用这种方案.它会遍历页面中所有的图片,将其src缓存起来后删除图片的src属

hibernate懒加载

16.懒加载 性能: 发出的sql语句越少,性能越高 方法: 1.懒加载 2.抓取策略 3.缓存策略 4.HQL语句   懒加载 1.类的懒加载 1.利用session.load方法可以产生代理对象 2.在session.load方法执行的时候并不发出sql语句 3.在得到其一般属性的时候发出sql语句 4.只针对一般属性有效,针对标示符属性是无效的 5.默认情况就是懒加载  2.集合的懒加载 <set name=""  lazy="" cascasd=&qu

MyBatis 懒加载

懒加载的概念 MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询. 当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力. 懒加载的适用场景: 当前业务只使用主加载对象的其他属性,或者暂时只使用主加载对象的其他属性,长时间以后才使用主加载对象的关联对象属性. 懒加载只对关联查询起作用(一对一.一对多.多对多),且只对嵌套查询方式起作用,因为嵌套结果.扩展类的方式都是一次查询所需数据,不存在子查询,也就不存在延迟加载的情况. MyBatis

边练边学--plist文件,懒加载,模型初使用--补充instancetype

一.什么是plist文件 1>将数据直接写在代码里面,不是一种合理的做法.如果数据经常修改,就要经常翻开对应的代码进行修改,造成代码扩展性低 2>因此,可以考虑将经常变得数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如果要变动数据,直接修改数据文件即可,不用修改代码 3>一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种“属性列表文件”的扩展名是plist,因此也成为“plist文件” 二.创建plist文件 三.解析plist文件 代码实

UIScrollView的滑动视图切换(懒加载)

最近在做一个股票项目,项目中有这么一个需求,利用UIScrollView左右切换去展示新闻资讯的详情,而且资新闻资讯很多.用zaker看过新闻的都应该很熟悉这个场景了.我的第一反应就是UIScrollView的懒加载.具体思路就是整个UIScrollView中只加载三个视图,这里用左.中.右来区分.下面说说我的具体实现,以期抛砖引玉. 在进入详情之前,是新闻的标题展示页,用UITableView展示的.点击某个标题,就进入到了该条新闻的详情页了.注意了,你需要把该新闻是第几条的索引值pageIn

Hibernate一对一,一对多懒加载的要求

懒加载要求Domain对象不能是final的,因为Hibernate需要生成一个继承自该Domain对象的类来实现懒加载.懒加载主要有三种: 1. 对象的懒加载 2. 关联集合的懒加载 3. 对象属性的懒加载 对象的懒加载 对象的懒加载就是在映射文件的class标签中设置lazy属性为true,这时,如果用session.load方法获取这个对象的话,Hibernate只返回一个代理对象,而不是真的去查询数据库,等到真正用到这个对象的时候,Hibernate才会去查询数据库. 关联集合的懒加载