文章目录
- 前言
- 一、懒加载的意义
- 二、懒加载的原理
- 三、懒加载优缺点
前言
iOS懒加载(Lazy Loading)是一种延迟加载的技术,它允许在需要的时候才初始化对象或执行某些操作,而不是在对象创建的时候立即执行。懒加载主要用于优化应用程序的性能和内存使用,特别是对于那些耗时或资源密集的操作。
在iOS开发中,懒加载通常应用于以下场景:
图片加载:在加载图片时,可以使用懒加载来延迟加载图片,避免一次性加载过多图片导致内存压力过大。当需要显示图片时,才加载并显示图片。
视图控制器的子视图:在视图控制器中,有些子视图可能只在特定条件下需要显示,而不是每次视图控制器加载时都需要。这时可以使用懒加载来延迟加载这些子视图,从而提高视图控制器的加载性能。
数据加载:在某些需要从网络或数据库获取数据的场景下,可以使用懒加载来在需要时才请求数据,并将数据缓存起来,避免重复请求相同的数据。
一、懒加载的意义
在我们打开一个程序时,往往需要时间去等待它的加载,如果一次性加载的时间过长,用户难免心烦,懒加载就应运而生
使用懒加载可以让我们的程序加载其主要需要的内容,当用户需要其他内容的时候再去加载那些没有加载的内容。一个十分明显的例子就是我们使用App查看图片时图片不是一开始就加载好的,需要等它加载一段时间。同时,如果一次性加载所有内容,对我们的手机流量也会造成很大的浪费
二、懒加载的原理
懒加载的原理可以简单描述为以下几个步骤:
创建属性:在对象的接口中声明一个属性,并在私有成员变量中创建一个实例变量来保存这个属性。
重写 Getter 方法:在实现文件中重写该属性的getter 方法。在 getter 方法中,首先检查私有成员变量是否已经被初始化,如果没有,则进行初始化。
懒加载初始化:在 getter 方法中进行懒加载的初始化。根据具体需求,可以在此处创建对象、加载资源、进行网络请求等。
返回实例:将初始化后的对象或资源返回给调用者。
我们通过原理可知,懒加载是围绕着setter与getter方法来实现的,这里我们必须要回忆之前学过的一个知识:使用直接访问成员变量与间接访问成员变量的区别
-
直接访问实例变量(_):
使用 _ 可以直接访问对象的实例变量,跳过了属性的 getter 和 setter 方法。这意味着如果在 getter 方法中实现了一些特殊逻辑,使用 _ 直接访问可能会绕过这些逻辑。因此,建议在对象内部使用 _,在外部使用 getter 和 setter 方法。 -
间接访问实例变量(self):
使用 self 可以调用属性的 getter 和 setter 方法。这样做的好处是可以在 getter 和 setter 方法中加入逻辑处理,比如在获取属性时进行懒加载,或在设置属性时进行数据校验。同时,通过 self 访问属性还可以防止循环引用,因为 self 在 ARC 下会被弱引用,而直接访问实例变量不会产生弱引用。
因为我们的懒加载实际上是通过重写我们的getter方法进行实现的,所以我们更常用直接访问实例变量的方式来实现懒加载,因为在懒加载中使用getter方法很可能引起循环引用,因为懒加载本身就是一个getter方法,由此我们给出懒加载的步骤:
- 在.h文件中创建一个属性
@property(nonatomic, strong)UILabel *t;
- 重写getter方法
- (UILabel *)t {
if (!_t) {//不能使用self.t,会造成getter方法的循环引用
_t = [[UILabel alloc] init];
//一些初始化操作
}
return _t;//不能使用self.t,会造成getter方法的循环引用
}
- 通过 self.users 或 [self users] 访问 users 属性以触发懒加载
// 加载网络数据
self.t = [LXBUsers objectArrayWithKeyValuesArray:responseObject[@"t"]];
[self t];
三、懒加载优缺点
优点:
节省资源:懒加载可以避免在对象初始化时立即加载数据或执行操作,只有在真正需要时才进行加载或执行,从而节省了不必要的资源消耗,提高了性能和效率。
延迟加载:懒加载可以将数据的加载或操作延迟到需要时再执行,这样可以提高应用的启动速度和响应速度。
减少内存占用:在懒加载中,对象的数据或资源只有在需要时才会被加载到内存中,避免了一次性加载大量数据导致内存占用过高的情况。
缺点:
实现复杂性:增加了代码可读性的同时增大了代码量
延迟加载导致的界面卡顿:如果在界面上使用了大量的懒加载,可能会导致在初次访问相关数据时出现短暂的界面卡顿,因为此时需要执行加载操作。
额外的资源消耗:虽然懒加载避免了一开始就加载所有数据,但在需要时仍需要进行加载,这会带来一定的资源消耗,特别是在网络请求或读取大量数据时。