【iOS】懒加载

文章目录


前言

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方法,由此我们给出懒加载的步骤:

  1. 在.h文件中创建一个属性
objectivec 复制代码
@property(nonatomic, strong)UILabel *t;
  1. 重写getter方法
objectivec 复制代码
- (UILabel *)t {
    if (!_t) {//不能使用self.t,会造成getter方法的循环引用
        _t = [[UILabel alloc] init];
        //一些初始化操作
    }
    return _t;//不能使用self.t,会造成getter方法的循环引用
}
  1. 通过 self.users 或 [self users] 访问 users 属性以触发懒加载
objectivec 复制代码
// 加载网络数据
self.t = [LXBUsers objectArrayWithKeyValuesArray:responseObject[@"t"]];
objectivec 复制代码
[self t];

三、懒加载优缺点

优点:

节省资源:懒加载可以避免在对象初始化时立即加载数据或执行操作,只有在真正需要时才进行加载或执行,从而节省了不必要的资源消耗,提高了性能和效率。

延迟加载:懒加载可以将数据的加载或操作延迟到需要时再执行,这样可以提高应用的启动速度和响应速度。

减少内存占用:在懒加载中,对象的数据或资源只有在需要时才会被加载到内存中,避免了一次性加载大量数据导致内存占用过高的情况。
缺点:

实现复杂性:增加了代码可读性的同时增大了代码量

延迟加载导致的界面卡顿:如果在界面上使用了大量的懒加载,可能会导致在初次访问相关数据时出现短暂的界面卡顿,因为此时需要执行加载操作。

额外的资源消耗:虽然懒加载避免了一开始就加载所有数据,但在需要时仍需要进行加载,这会带来一定的资源消耗,特别是在网络请求或读取大量数据时。

相关推荐
我很好我还能学1 小时前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
蓝婷儿1 小时前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习
渣渣盟2 小时前
基于Scala实现Flink的三种基本时间窗口操作
开发语言·flink·scala
糯米导航2 小时前
Java毕业设计:办公自动化系统的设计与实现
java·开发语言·课程设计
糯米导航2 小时前
Java毕业设计:WML信息查询与后端信息发布系统开发
java·开发语言·课程设计
itme2682 小时前
解决cocos 2dx/creator2.4在ios18下openURL无法调用的问题
macos·objective-c·cocoa
MessiGo2 小时前
Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象
开发语言·javascript·原型模式
大霞上仙3 小时前
nonlocal 与global关键字
开发语言·python
galaxy_strive3 小时前
绘制饼图详细过程
开发语言·c++·qt
黑客老李3 小时前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached