当前位置: 首页 > news >正文

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

三、懒加载优缺点

优点:

节省资源:懒加载可以避免在对象初始化时立即加载数据或执行操作,只有在真正需要时才进行加载或执行,从而节省了不必要的资源消耗,提高了性能和效率。
延迟加载:懒加载可以将数据的加载或操作延迟到需要时再执行,这样可以提高应用的启动速度和响应速度。
减少内存占用:在懒加载中,对象的数据或资源只有在需要时才会被加载到内存中,避免了一次性加载大量数据导致内存占用过高的情况。

缺点:

实现复杂性:增加了代码可读性的同时增大了代码量
延迟加载导致的界面卡顿:如果在界面上使用了大量的懒加载,可能会导致在初次访问相关数据时出现短暂的界面卡顿,因为此时需要执行加载操作。
额外的资源消耗:虽然懒加载避免了一开始就加载所有数据,但在需要时仍需要进行加载,这会带来一定的资源消耗,特别是在网络请求或读取大量数据时。

相关文章:

【iOS】懒加载

文章目录 前言一、懒加载的意义二、懒加载的原理三、懒加载优缺点 前言 iOS懒加载(Lazy Loading)是一种延迟加载的技术,它允许在需要的时候才初始化对象或执行某些操作,而不是在对象创建的时候立即执行。懒加载主要用于优化应用程…...

《脱离“一支笔、一双手、一道力扣”困境的秘诀》:突破LeetCode难题的五个关键步骤

导言: 在解决LeetCode等编程题时,不少人会陷入“一支笔、一双手、一道力扣(LeetCode)做一宿”的困境。尽管已经掌握了相关知识和算法,但在实际挑战中却无从下手。本文将分享如何摆脱这一困境的秘诀,让你在面…...

基于jeecg-boot的任务甘特图显示

更多功能看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 基于项目的任务显…...

docker export,import后无法运行,如java命令找不到,运行后容器内编码有问题

为什么用docker export呢,😔~由于客户环境太恶心了,测试一次更是麻烦,所以什么都得在本地调试完成,争取每次测试上线一次通过才行,说多了都是泪。 由于踩坑几次了,每次都忘记,且每次…...

Web3教程| 什么是地址监控?如何使用地址监控追踪黑客地址?

在当今Web3世界里,保护个人资产安全至关重要。据报道在2023年上半年,Web3领域因黑客攻击事件造成的损失高达4.794亿美元。 此外,10多个公链遭受黑客攻击,其中以太坊链遭受的损失最多,约为2.87亿美元。这些黑客的存在迫…...

flask结合mysql实现用户的添加和获取

1、数据库准备 已经安装好数据库,并且创建数据库和表 create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci; CREATE TABLE admin( id int not null auto_increment primary key, username VARCHAR(16) not null, password VARCHAR(64) not null…...

阿里云服务器配置 内存,cpu等等

实例升配,https://help.aliyun.com/document_detail/25438.html?spma2c4g.11174283.6.780.2cbf4c070oeino#title-a5t-gg2-...

PHP注册、登陆、6套主页-带Thinkphp目录解析-【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图主页注册,登陆 phpStudy 设置导数据库项目目录如图:代码部分:控制器前台的首页 其它配套页面展示直接给第二套方案的页面吧第三套…...

android Activity设置背景为半透明的时候会显示上一个activity的内容

在弹出PopupWindow时将当前Activity设置成了半透明: WindowManager.LayoutParams lp = this.activity.getWindow().getAttributes();lp.alpha = 0.5f; //0.0-1.0this...

Linux 网络收包流程

哈喽大家好,我是咸鱼 我们在跟别人网上聊天的时候,有没有想过你发送的信息是怎么传到对方的电脑上的 又或者我们在上网冲浪的时候,有没有想过 HTML 页面是怎么显示在我们的电脑屏幕上的 无论是我们跟别人聊天还是上网冲浪,其实…...

flex: 0 0 273px的意思

flex: 0 0 273px; 是一条CSS属性,用于设置flexible box布局(flexbox)中的flex子项的灵活性和尺寸。 这条属性包含三个值,分别是: flex-grow: 表示弹性增长因子,指定当有多余空间时,子项能够增长…...

helm部署rabbitmq

1.添加rabbitmq仓库并下载包 helm repo add bitnami https://charts.bitnami.com/bitnami helm pull bitnami/rabbitmq --version 10.1.4 tar -zxvf rabbitmq-10.1.4.tgz mv values.yaml values.yaml.back grep -v "#" values.yaml.back > values.yaml2.helm部署…...

Java版Spring Cloud+Spring Boot+Mybatis+uniapp知识付费平台讲解

提供私有化部署,免费售后,专业技术指导,支持PC、APP、H5、小程序多终端同步,支持二次开发定制,源码交付。 Java版知识付费-轻松拥有知识付费平台 多种直播形式,全面满足直播场景需求 公开课、小班课、独…...

编程之舞:流程控制乐章

流程控制语句 1. 复合语句 2. 条件语句2.1 if条件语句2.2 switch多分支语句 3. 循环语句3.1 while循环语句3.2 do...while循环语句3.3 for循环语句 4. 循环控制4.1 break语句4.2 continue语句 5. 实践与练习 1. 复合语句 复合语句是由一对花括号括起来的语句块,可以…...

ChatGPT是否能够进行情感融合和语气调整?

ChatGPT是一种预训练的通用语言模型,具有很强的文本生成和理解能力。在情感融合和语气调整方面,ChatGPT可以通过特定的技术和训练方法实现一定程度的情感表达和语气调整。下面将详细探讨ChatGPT在情感融合和语气调整方面的应用方法和潜力。 1. **情感融…...

C++--动态规划路径问题

1.不同路径 力扣 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从…...

从实践彻底掌握MySQL的主从复制

目录 一、本次所用结构如图---一主多从级联: 二、IP。 三、配置M1: 四、从库M1S1: 五、从库M2配置: 六、 从库M2S1: 一、本次所用结构如图--- 一主多从级联: 二、IP。这里M1S1和M1S2一样的&#xff0…...

机器学习深度学习——线性回归的基本元素

回归用来表示输入输出之间的关系。 用实际例子来解释一下线性回归:根据房屋的面积、房龄来估算房屋价格。为了实现这个预测放假的模型,需要收集一个真实的数据集,该数据集包括了房屋的销售价格、面积和房龄。 在机器学习中,这个数…...

K8S初级入门系列之八-网络

一、前言 本章节我们将了解K8S的相关网络概念,包括K8S的网络通讯原理,以及Service以及相关的概念,包括Endpoint,EndpointSlice,Headless service,Ingress等。 二、网络通讯原理和实现 同一K8S集群&…...

分段@Transactional 坑及失效问题

Transactional 背景&#xff1a;在某些情况下&#xff0c;我们需要分段transaction&#xff0c;在最外面没有transaction&#xff0c;里面分成几个transaction&#xff0c;保证分段是成功的。 问题代码&#xff1a; Service public Order getOrder1(String id) {Optional<Or…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...