【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];

三、懒加载优缺点

优点:

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

缺点:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从JVM指令看String对象的比较

在翻看各类 java 知识中,总会提到如下知识:比较 String 对象,例如: String a1new String("10"); String a2"10"; String a3"1""0";//结果 System.out.println(a1a2); //false System.ou…

Django接口返回JSON格式数据报文

目录 遇到问题 Django返回json结构报文 不可行方式python json 可行方式JsonResponseQuerySet.values()。 python的两个web框架,flask和django,两者都具有view 模板的章节,但是当前开发一个应用,大部分采用前后端分离的合作方式。…

Vscode python Debug环境异常Timed out waiting for launcher to connet

文章目录 launch.json配置console launch.json配置console {"configurations": [{"name": "Python: Current File","type": "python","request": "launch","program": "${file}",…

Web3D之简介

参考资料 什么是Web3D?Web3D技术发展历程以及Web3D应用场景在Web中用上3D技术-Spline 「What」什么是 Web3D? Web3D是指在Web浏览器中展示和交互的三维图形技术。它是将三维图形技术与Web技术相结合的产物,可以通过浏览器在网页上呈现出逼…

HBase有写入数据,页面端显示无数据量

写了一个测试类,插入几条数据,测试HBase的数据量。很简单的功能,这就出现问题了。。网页端可以看到,能够看到读写请求,但是不管是内存、还是磁盘,都没有数据。 于是就想到去HDFS查看,也是有数据…

ThinkPHP框架特性详解

ThinkPHP是一款用于快速开发的PHP MVC框架,它提供了各种有用的特性,用于设计和实现具有高质量、可维护性和可扩展性的Web应用程序。这篇文章将深入探讨ThinkPHP的一些关键特性。 1. MVC架构 MVC架构是ThinkPHP的核心组成部分,它代表模型(Mod…

【C++】总结5

文章目录 初始化列表explicit和mutable友元内部类 初始化列表 在构造函数中,我们可以给对象一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次…

windows命令行

参考:https://blog.csdn.net/u014419722/article/details/130427423 1、 创建文件夹(mkdir或md) 创建单个文件:mkdir cmd_test 创建二级文件:mkdir cmd_test\456\123 创建多个文件:mkdir cmd_test\000 cmd_test\111 2…

解决openstack重启swift服务后报错

swift重启报错 问题描述解决办法 问题描述 swift服务正常状态如下 [rootcontroller ~]# swift statAccount: AUTH_8bde12ff804e42498661b7454994c446Containers: 0Objects: 0Bytes: 0X-Put-Timestamp: 1690507907.67931X-Timestamp: 1690507907.67931X-Trans-Id: tx56d22fa13…

idea快速运行vue项目

目录 一、前提 二、步骤 安装vue.js插件 添加脚本 进行如下配置 一、前提 安装好node.js环境并初始化完成和安装好依赖 二、步骤 安装vue.js插件 打开idea,然后在File–Settings–Plugins–Makerplace下找到vue.js插件,安装并重启idea 添加脚本 进行如下配置 在Sctipts中根…

Linux复习——基础知识

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 1. 有关早期linux系统中 sysvin的init的7个级别描述正确的是( )[选择1项] A. init 1 关机状态 B. init 2 字符界面多用户模式 …

【MySQL进阶(三)】 InnoDB体系架构之内存池(buffer pool)

InnoDB体系架构之内存池 一、InnoDB 体系结构二、缓冲池 buffer pool内部结构free 链(管理空闲缓冲页)怎么知道数据页是否被缓存? flush 链表(管理脏页)1. 脏页2. 链表结构3. 刷盘时机 LRU 链表(控制数据热…

影视行业案例 | 燕千云助力大地影院集团搭建智能一体化IT服务管理平台

影视行业过去三年受新冠肺炎疫情影响,经历了一定程度的冲击和调整,但也展现出了强大的韧性和潜力。2023年中国影视产业规模可能达到2600亿元左右,同比增长11%左右。影视行业的发展趋势主要表现在内容创新、模式创新和产业融合三个方面&#x…

ICC2如何计算Gate Count?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?知识星球入口 我们认为gate count等于standard cell(非physical only)总面积 / 最小驱动二输入与非门面积。 ICC2没有专门的命令去报告gate count,只能自己计算,使用report_d…

Jasper裁员,成也GPT,败也GPT

大家好! 我是老洪。 今天来聊一聊人工智能(artificial intelligence),简称AI。 当前的AI可谓是热火朝天, 自从ChatGPT发布以来,引起了广泛的关注和热情, 许多公司和研究者都试图将其应用于自己的产品或研究中。 按理说…

Redis高级篇之布隆过滤器

版本 SpringBoot 2.6.1Mybatis-Plus 3.5.3.1Guava 23.0 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

面试题:什么是闭包?

一、怎么理解闭包&#xff1f; 简单理解&#xff1a;闭包 内层函数 外层函数的变量 下面是一组简单的闭包代码&#xff1a; function outer() {let count 1function inner() {console.log(count)}inner() } outer()闭包有两个注意点&#xff1a; 闭包一定有return吗&#x…

如何利用设备数字化平台推动精益制造?

人工智能驱动技术的不断发展&#xff0c;尤其是基于机器学习的预测分析工具的使用&#xff0c;为制造业带来了全新的效率和价值水平。一直以来&#xff0c;精益生产&#xff08;也叫精益制造&#xff09;在制造业中扮演着重要角色&#xff0c;而现在通过与工业 4.0的融合&#…

word怎么转换成pdf?分享几种转换方法

word怎么转换成pdf&#xff1f;将Word文档转换成PDF文件有几个好处。首先&#xff0c;PDF文件通常比Word文档更容易在不同设备和操作系统上查看和共享。其次&#xff0c;PDF文件通常比Word文档更难以修改&#xff0c;这使得它们在需要保护文件内容的情况下更加安全可靠。最后&a…

【无标题】python和Java 企业微信群发消息

python企业微信群发消息 GitHub - LinuxSuRen/phoenix.webui.framework: 基于WebDriver的WebUI自动化测试框架 #! -*- coding: utf-8 -*- """ Author: ZhenYuSha Create type_time: 2020-2-24 Info: 定期向企业微信推送消息 """ import reques…