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

懒加载的概念

懒加载

  • 懒加载的概念
  • 懒加载的实现
  • 懒加载的优缺点

懒加载的概念

懒加载是 iOS 开发中一个非常重要且常用的设计模式,也称延迟加载。它的核心思想是:一个对象的初始化被延迟到第一次真正需要它的时候,从而节省内存和提高性能。

在 iOS 开发中, 懒加载有以下几个常用场景:

  • 图片加载:为避免一次性加载图片过多而导致内存压力过大,因此使用懒加载在需要图片时再加载并显示图片。
  • 视图控制器的子视图:在视图控制器中,有些子视图只需要在特定条件下显示,而不是每次视图控制器加载时都需要,因此需要使用懒加载来延迟加载这些子视图,从而提高视图控制器的的加载性能。
  • 数据加载:在需要从网络请求或数据库获取数据时,可以使用它懒加载在需要时请求数据,并将数据缓存下来,避免重复请求。

懒加载的实现

  • 创建属性:在对象接口中声明一个属性,并在私有成员变量中创建一个实例变量来保存这个属性。
  • 重写getter方法:在getter方法中 ,检查私有成员变量是否已经被初始化,如果没有,则进行初始化。
  • 懒加载初始化:在getter方法中进行懒加载的初始化,根据需求创建对象、加载图片数据、进行网络请求数据等。
  • 返回实例:将初始化后的对象或资源返回给调用者。

注意⚠️

  1. 我们在创建属性时,必须使用strong关键字修饰。这是因为strong修饰的对象在被销毁时,不会被释放;而weak修饰的对象在被销毁时,weak指针自动指向nil。也就是说,当我们创建并初始化控件后,还未来得及将其赋值给一个指针并添加到视图上时就已经被自动释放掉了,也就是创建失败。
  2. 懒加载我们更常用直接访问实例变量的方法来实现。懒加载本身就是一个重写的getter方法,因此使用直接访问实例变量的方法可以防止循环引用。

直接访问成员变量 🆚 间接访问成员变量:

  • 直接访问成员变量 (_):使用 _ 可以跳过setter和getter方法。也就是说,如果getter方法中实现了一些特殊逻辑,使用 _ 可以直接跳过这些逻辑。
  • 间接访问成员变量(self):使用self可以调用属性的setter和getter方法,这样如果getter方法中有特殊逻辑,则会被处理。
#import <UIKit/UIKit.h>@interface ViewController : UIViewController@property(nonatomic, strong) UILabel *label;
@property(nonatomic, strong) UIButton *testButton;@end#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[self.view addSubview:self.label];[self.view addSubview:self.testButton];
}-(UILabel*) label {if (!_label) {_label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];_label.text = @"iOS";_label.font = [UIFont systemFontOfSize:20];_label.textColor = [UIColor blackColor];NSLog(@"懒加载初始化");}return _label;
}- (UIButton *)testButton {if (!_testButton) {_testButton = [UIButton buttonWithType:UIButtonTypeSystem];_testButton.frame = CGRectMake(100, 300, 150, 50);[_testButton setTitle:@"点击生成" forState:UIControlStateNormal];_testButton.titleLabel.font = [UIFont boldSystemFontOfSize:16];[_testButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];_testButton.backgroundColor = [UIColor systemBlueColor];_testButton.layer.cornerRadius = 8;[_testButton addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside];}return _testButton;
}- (void)buttonTapped {[self.view addSubview:self.label];
}@end 

展示一下效果:
在这里插入图片描述

在这里插入图片描述

看的出来,只有在一次初始化时会NSLog一下,而后面再点击按钮时,都不会再初始化,只会复用现有的label。

懒加载的优缺点

  • 优点
    • 节省内存:对象只在真正需要的时候才创建,避免不必要的内存占用。
    • 提高性能:应用启动时不用一次性创建所有控件或数据,页面初始化更快。
    • 节省资源:避免在对象初始化时立即加载数据或执行操作,只有在真正需要时才进行加载或执行,从而节省了不必要的资源消耗。
  • 缺点
    • 首次访问时有延迟:第一次访问时才创建对象,如果对象很大(比如图片、数据库连接),可能会导致 瞬时卡顿。
    • 多线程下可能有风险:如果多个线程同时访问懒加载的属性,可能出现重复初始化或线程安全问题。
    • 额外的资源消耗:虽然懒加载避免了一开始就加载所有数据,但在需要时仍需要进行加载,这会带来一定的资源消耗,特别是在网络请求或读取大量数据时。

文章转载自:

http://JHEhykGj.wrcym.cn
http://r10DwoLs.wrcym.cn
http://CAtQDgPp.wrcym.cn
http://EQ25IhGf.wrcym.cn
http://fX1NglCK.wrcym.cn
http://OYIkOMDf.wrcym.cn
http://GcauNdbc.wrcym.cn
http://uKnzvHlT.wrcym.cn
http://th04006v.wrcym.cn
http://Eq6Dtlh9.wrcym.cn
http://tFNJSPy4.wrcym.cn
http://hjNjX4fI.wrcym.cn
http://ccxx3pbz.wrcym.cn
http://qMTk5mgy.wrcym.cn
http://REoTPnT2.wrcym.cn
http://nQDNvB2z.wrcym.cn
http://jqjox4hC.wrcym.cn
http://pmy5BPXP.wrcym.cn
http://v3vZFuus.wrcym.cn
http://PTI1KrwT.wrcym.cn
http://DSvBaUy5.wrcym.cn
http://3oBFXf8D.wrcym.cn
http://X7RRj2T5.wrcym.cn
http://nkF2PhAh.wrcym.cn
http://3um7vYRB.wrcym.cn
http://CzIsqSN0.wrcym.cn
http://l2LtJbfP.wrcym.cn
http://Il6Y33bk.wrcym.cn
http://XGinrzKl.wrcym.cn
http://sfsWXTks.wrcym.cn
http://www.dtcms.com/a/370934.html

相关文章:

  • panther X2 armbian24 安装宝塔(bt)面板注意事项
  • 少儿配音教育:广州声与色在线科技有限公司打造趣味课程,助力青少年语言能力提升
  • 零基础学习数据采集与监视控制系统SCADA
  • springboot vue sse消息推送,封装系统公共消息推送前后端方法
  • 万字长文详解 MyCat 分表分库:从 0 到 1 构建高可用订单系统
  • Transformer架构(详解)
  • MySQL连接字符串中的安全与性能参数详解
  • Apache Kylin:一款免费开源、高并发、高性能的OLAP引擎
  • Linux 96 shell:expect { }
  • 项目中的一些比较实用的自定义控件
  • 【Canvas与图标】古铜色“HTML”图标
  • 【Postman】对GET请求的参数进行URL编码
  • 【IQA技术专题】 多尺度的transformer网络IQA:MUSIQ
  • 嵌入式学习——ARM 体系架构1
  • Kafka面试精讲 Day 9:零拷贝技术与高性能IO
  • 【65页PPT】智慧数字乡村农业大数据平台解决方案(附下载方式)
  • 服务器线程高占用定位方法
  • 【基础-单选】关于UIAbility的启动模式,下列说法错误的是
  • 【111】基于51单片机停车场车位管理系统【Proteus仿真+Keil程序+报告+原理图】
  • mysql死锁排查与解决
  • 从零开始学AI——14
  • 【CSP-S】数据结构 ST 表详解
  • 积分球的使用——简易版
  • 基于Echarts+HTML5可视化数据大屏展示-图书馆大屏看板
  • 讲解一下冒泡排序
  • 【基础-单选】关于容器组件Row和Column,下面说法错误的是
  • 【佳易王药品进销存软件实测】:操作简单 + 全流程管理,医药台账管理好帮手#软件教程全解析
  • 项目升级--Nginx
  • HOT100--Day13--104. 二叉树的最大深度,226. 翻转二叉树,101. 对称二叉树
  • 修复存在坏块或05、C4、C5 S.M.A.R.T错误的硬盘