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

【iOS】懒加载

懒加载

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

懒加载的概念

懒加载是 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://www.xdnf.cn/news/20561.html

相关文章:

  • 简说【高斯随机场 (GRF)】
  • 【面向对象编程——继承和派生】
  • 脚本作业解析
  • 个人成长职业发展
  • Simulink子系统、变体子系统及封装知识
  • 山西移动九联UNT413HS-海思MV320-2+8G-原机全量备份包
  • 如何训练一个简单的Transformer模型(附源码)李宏毅2025大模型-作业4
  • 高精度地图
  • 【LeetCode - 每日1题】使数组元素都变为零的最少操作次数
  • [光学原理与应用-421]:非线性光学 - 数字信号处理中的线性与非线性运算
  • 【医学影像 AI】YoloCurvSeg:仅需标注一个带噪骨架即可实现血管状曲线结构分割
  • idf--esp32的看门狗menuconfig
  • JAVA快速学习(二)
  • xftp断网后提示错误如何继续下载?
  • Python自学12 - 常用数据结构之字典
  • 基于接口的事件机制
  • python入门常用知识
  • Phthon3 学习记录-0707
  • 积分球的使用——简易版
  • 强化学习入门:从零开始实现DDQN
  • Ai8051 2.4寸320*240 ILI9341 I8080接口驱动
  • 人工智能学习:基于seq2seq模型架构实现翻译
  • 项目初始化上传git
  • Qemu-NUC980(四):SDRAM Interface Controller
  • 什么是“二合一矫平机”?——一篇技术科普
  • 主流的开源协议(MIT,Apache,GPL v2/v3)
  • Qt编程之信号与槽
  • 吴恩达机器学习(八)
  • make时设置链接器选项的2种方法
  • 【操作系统-Day 25】死锁 (Deadlock):揭秘多线程编程的“终极杀手”