鸿蒙开发5.0【弱引用】 使用

news2024/9/20 22:05:45

开发者需要依靠弱引用解决垃圾回收相关的内存管理问题。

  • 强引用:默认的引用类型,被强引用的对象不会被垃圾回收。
  • 弱引用:允许对象在没有其他强引用时被垃圾回收,不会阻止垃圾回收器回收该对象。

场景一:使用弱引用打破循环引用,确保对象能够被垃圾回收

循环引用

只要这个循环引用存在,即使外部没有这两个对象的强引用,它们也不会被垃圾回收。

class Student {
  teacher: Teacher | null = null;
}
class Teacher {
  student: Student | null = null;
}
const sTom = new Student();
const sMichael = new Teacher();
sTom.teacher = sMichael;
sMichael.student = sTom;

使用弱引用打破循环引用

由于使用了WeakRef弱引用,只要没有其他强引用指向这个两个对象,它们就可以被垃圾回收,只要有一方使用弱引用,即可解除两者的循环引用。

class Parent {
  child: WeakRef<Child> | null = null;
}
class Child {
  parent: WeakRef<Parent> | null = null;
}
const pMissWang = new Parent();
const cMaria = new Child();
// 使用 WeakRef 包装对象引用
pMissWang.child = new WeakRef(cMaria);
cMaria.parent = new WeakRef(pMissWang);

场景二:WeakMap和WeakSet仅持有对对象的弱引用,和WeakRef一样它们也不会阻止垃圾回收。

WeakSet和WeakMap都是用于存储弱引用的集合类型,WeakSet存储对象,WeakMap存储键值对。

与WeakRef的区别:WeakSet和WeakMap可用来保存引用对象,但不支持取出对象WeakRef支持存取对象。

WeakSet

不能从 WeakSet 中取出或获取某个对象,只能检查是否存在于集合中使用 WeakSet 存储对象并检查是否存在,可以依据这一特性判断对象是否被垃圾回收。

interface Student {
  name: string;
}
const sAlice: Student = { name: 'Alice' };
const sBob: Student = { name: 'Bob' };
const studentWeakSet = new WeakSet<Student>();
// 将学生对象添加到 WeakSet 中
studentWeakSet.add(sAlice);
studentWeakSet.add(sBob);
// 检查学生对象是否存在于 WeakSet 中
console.log('sAlice exists:', studentWeakSet.has(sAlice)); // 输出: true
console.log('sBob exists:', studentWeakSet.has(sBob)); // 输出: true
// 创建一个新的学生对象(不在 WeakSet 中)
const sEve: Student = { name: 'Eve' };
// 检查新学生对象是否存在于 WeakSet 中
console.log('sEve exists:', studentWeakSet.has(sEve)); // 输出: false
// 删除一个学生对象
studentWeakSet.delete(sAlice);
// 再次检查删除后的学生对象是否存在于 WeakSet 中
console.log('sAlice exists:', studentWeakSet.has(sAlice)); // 输出: false

WeakMap

不能列出WeakMap中的所有键或值,只能通过已知的键来访问对应的值。使用WeakMap存储键值对并通过已知的键访问值。

interface Teacher {
  name: string;
}
const tSmith: Teacher = { name: 'Mr. Smith' };
const tJohnson: Teacher = { name: 'Ms. Johnson' };
const teacherCourseMap = new WeakMap<Teacher, string>();
// 将教师对象和对应的课程信息添加到 WeakMap 中
teacherCourseMap.set(tSmith, 'Math');
teacherCourseMap.set(tJohnson, 'History');
// 通过已知的教师对象获取对应的课程信息
console.log('tSmith teaches:', teacherCourseMap.get(tSmith)); // 输出: Math
console.log('tJohnson teaches:', teacherCourseMap.get(tJohnson)); // 输出: History
// 创建一个新的教师对象作为键(不在 WeakMap 中)
const tBrown: Teacher = { name: 'Mr. Brown' };
// 尝试通过新的教师对象获取课程信息
console.log('tBrown teaches:', teacherCourseMap.get(tBrown)); // 输出: undefined

WeakRef

用WeakRef创建对象的弱引用,支持在需要时获取原始对象,必须在对象仍然存在时才能获取,如果被回收需要重新创建,一般采用WeakRef的deref()方法获取原始对象。

class FamilyMember {
}
// 存储家庭成员的弱引用
const parentWeakRef = new WeakRef<FamilyMember>(new FamilyMember());
// 获取原始家庭成员对象
const parent = parentWeakRef.deref();
// 检查是否存在目标家庭成员对象,如果目标对象已经被回收,deref() 将返回 undefined。
if (parent) {
  console.log('Family member exists');
} else {
  console.log('Family member does not exist');
}

场景三弱引用的垃圾回收时机

WeakRef 主要用于允许对象被垃圾回收,但不保证对象何时会被回收,其垃圾回收时机是不确定的。

由于WeakRef不能检测对象何时被垃圾回收,没有提供与垃圾回收事件关联的回调机制,所以只能通过主动轮询的方式定期检查对象是否已经被回收。

interface User {
  username: string
}
const user: User = { username: "john_doe" }
const userWeakRef = new WeakRef(user)
//用定时器轮训检测对象是否被回收
const thetime = setInterval(() => {
  if (userWeakRef.deref() === undefined) {
    console.log('Object has been disappear');
    clearInterval(thetime);//结束轮询
  }
}, 1000);

HarmonyOS可用FinalizationRegistry实现类似监控对象生命周期的能力。

使用FinalizationRegistry注册对象后,当对象被垃圾回收时,会调用提供的回调函数。

// 定义回调函数,当目标对象被垃圾回收时会调用该函数
function cleanupCallback(heldValue: number) {
  console.log(`Callback received: ${heldValue}`);
}

export function demoFinalizationRegistry() {
  // 创建一个 FinalizationRegistry 实例,传入回调函数
  const finalizationRegistry = new FinalizationRegistry<number>(cleanupCallback);

  // 定义用于注册和取消注册的类
  class TargetClass {
  }

  class UnregisterTokenClass {
  }

  // 创建对象实例
  let targetObject: TargetClass = new TargetClass();
  let unregisterToken: UnregisterTokenClass = new UnregisterTokenClass();
  // 设置传给回调函数的具体数据
  let dataToCleanup = 1;
  // 注册对象到 FinalizationRegistry
  finalizationRegistry.register(targetObject, dataToCleanup, unregisterToken);
  // 取消注册
  finalizationRegistry.unregister(unregisterToken);
}

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

2

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
3

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

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

相关文章

揭秘!老人帕金森与嗜睡之谜:是病症常态还是另有隐情?

在关爱老年人健康的道路上&#xff0c;帕金森病这一神经退行性疾病总是牵动着无数家庭的心。随着病情的发展&#xff0c;不少患者家属会发现&#xff0c;家里的老人似乎比以前更容易感到疲倦&#xff0c;甚至频繁出现嗜睡的情况。这不禁让人疑惑&#xff1a;老人帕金森会一直想…

数学建模——Box-Cox变换

用途&#xff1a;当某个随机变量 X X X 不服从正态分布的时候&#xff0c;可以尝试通过这种变换将其变成正态分布。 两个常用的变换 对数变换&#xff1a;已知随机变量 X X X&#xff0c;如果有 ln ⁡ X ∼ N ( μ , σ 2 ) \ln X\sim N(\mu,\sigma^2) lnX∼N(μ,σ2)&…

快被右下角的windows Defender烦死了,怎么让它消失?

前言 前段时间有小伙伴问&#xff1a;Windows自带的杀毒软件Windows Defender怎么关掉&#xff1f; 原因是无论在Windows Defender软件界面里怎么关闭&#xff0c;它都会拦截到某些软件和文件。 而且对于强迫症患者来说&#xff0c;右下角始终有个图标&#xff0c;还带了个x的…

【开源风云】从若依系列脚手架汲取编程之道(四)

&#x1f4d5;开源风云系列 &#x1f34a;本系列将从开源名将若依出发&#xff0c;探究优质开源项目脚手架汲取编程之道。 &#x1f349;从不分离版本开写到前后端分离版&#xff0c;再到微服务版本&#xff0c;乃至其中好玩的一系列增强Plus操作。 &#x1f348;希望你具备如下…

有了室内外一体化人行导航,你还怕迷路吗?

在快节奏的现代生活中&#xff0c;无论是穿梭于繁华的都市丛林&#xff0c;还是漫步于错综复杂的购物中心&#xff0c;迷路似乎成了不少人的“小确丧”。然而&#xff0c;随着科技的飞速发展&#xff0c;一项革命性的创新——室内外一体化人行导航系统&#xff0c;正悄然改变着…

CAN总线(一)

CAN总线&#xff08;Controller Area Network Bus&#xff09;&#xff0c;从名字上可以知道&#xff0c;CAN总线构建的是一种局域网网路&#xff0c;每个挂载在CAN总线上的设备都可以利用这个局域网去发送自己的消息&#xff0c;也可以接收局域网的各种消息&#xff0c;每个设…

解锁高效驱动密码:SiLM8260A系列SiLM8260ABCS-DG 集成米勒钳位的双通道隔离驱动芯片

附上SiLM8260A同系列型号参考&#xff1a; SiLM8260ADCS-DG 12.5V/11.5V SiLM8260ABCS-DG 8.5V/7.5V SiLM8260AACS-DG 5.5V/5V SiLM8260AGCS-DG 3.5V/3V SiLM8260ABCS-DG是一款集成了米勒钳位功能的双通道隔离驱动芯片&#xff0c;它精准地满足了上述严苛条件。具备…

Excel排序错误原因之一

# Excel日常表格中的文字排序乱了&#xff0c;在系统语言更改成英语之后&#xff0c;不再按照首字母的顺序排列&#xff0c;且强制设置序列顺序也无济于事。 Excel表格内的排序尝试 表格基础选项就有“排序”&#xff0c;在其自定义选项中的“选项”设置处设置“拼音排序”&am…

2024年实体行业都在用的AI自动直播,有哪些可以发展的机会?

抖捧AI自动直播系统&#xff0c;是一款结合Ai和短视频营销的自动化直播辅助工具&#xff0c;针对企业和实体店有多重的应用场景&#xff0c;通过预设的直播脚本和智能回复逻辑&#xff0c;实现不需要真人参与&#xff0c;就可以实现全天候24小时直播&#xff0c;当用户进入直播…

【Java基础】ThreadLocal<LoginUser>:存储登录用户信息

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【一篇文章搞定】LVGL显示中文+解决keil下LVGL无法正常显示中文及error:#8:missing closing quote问题

LVGL显示中文 进入lvgl中文文档&#xff1a;显示中文 — LVGL 文档 (100ask.net) 下载字体zip文件&#xff0c;解压得到一个.otf文件 进入LVGL的字体转换网站 Font Converter — LVGL 1.点击Browse指定.otf文件即可 2.range不用管 3.为了节省内存在Symbols中输入自己要使用的…

【计算机网络】概述篇

目录 导学 计算机网络的发展简史 互联网的发展历史 中国互联网的发展历史 计算机网络的层次结构 层次结构设计的基本原则 OSI七层模型 TCP/IP四层模型 现代互联网的网络拓扑 计算机网络的性能指标 速率 时延 发送时延 ​传播时延 ​排队时延 处理时延 总时延 …

K8S - Emptydir - 取代ELK 使用fluentd 构建logging saidcar

由于k8s 的无状态service 通常部署在多个POD中&#xff0c; 实现多实例面向高并发。 但是k8s 本身并没有提供集中查询多个pod的日志的功能 其中1个常见方案就是ELK. 本文的方案是 利用fluentd sidecar 和 emptydir 把多个pod的日志导向到bigquery的table中。 Emptydir 的简介 …

STM32F407ZGT6单片机HAL库——DAC输出

一、输出直流电压 1.cubemax的配置&#xff08;通道1&#xff09; 2.直流电压大小计算 3.主函数加入初始化的程序 float DAC_voltage1.5;HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_voltage*4095/3.3);//HAL_DAC_Start(&hdac,DAC_CHANNEL_1); 二、…

深度解析价值流:推动业务架构创新与效益提升的核心指南

数字化转型下的价值流管理与架构 在当今的数字化转型背景下&#xff0c;如何有效创造并交付价值&#xff0c;成为企业竞争力提升的关键课题。作为企业架构的重要组成部分&#xff0c;价值流的概念为业务决策者和技术人员提供了全面的工具&#xff0c;帮助优化业务能力&#xf…

java,php,go,nodejs,Python开发web项目优缺点对比

Java 优点:java 是一门广泛应用于企业级开发的语言,丰富且庞大的开发框架和库。有较高的性能和可伸缩性。生态系统庞大且成熟,拥有大量的开源框架和工具,可以加速开发过程。 内置对多线程的支持,适合处理高并发的 Web 项目。 缺点:相比其他语言,Java 的语法相对冗长繁琐…

Linux-Shell编程【看这一篇就够了!!!】

目录 前言 什么是Shell编程 Shell脚本的执行方式 脚本格式要求 运行一个Shell 一个Shell例子 Shell的变量 shell变量的定义 设置环境变量 简单示范 位置参数变量 预定义变量 基本语法 运算符 应用案例 条件判断 单流程判断 常用判断条件 应用案例 多流程判…

Type-C 接口 取电 PD快充协议取电电压5V、9V、15V、20V

随着Type-C接口的普及&#xff0c;快充技术融入进了各种电子设备中&#xff0c;然而快充技术里快充协议是必不可少的&#xff0c;目前市面上已经出现多种快充协议&#xff0c;最常见的便是Type-C PD协议&#xff0c;下面来以起了解以下PD协议。 PD协议的工作原理主要是基于电压…

【OpenCV】灰度化和二值化处理图像

文章目录 1. 图像灰度化处理对比2. 代码示例3. 二值化处理 1. 图像灰度化处理对比 2. 代码示例 #include <opencv2/opencv.hpp> using namespace cv;int main() {Mat currentImage imread("path_to_image.jpg"); // 读取彩色图像Mat grayImage;// 将彩色图像…

负债不再是障碍?银行信贷“白名单“揭秘

谈及银行信贷产品&#xff0c;常闻有言称存在无需考量负债与查询记录之奇品&#xff0c;此等说法十有八九为中介诱人上钩之辞。轻信之下&#xff0c;恐将步入连环陷阱。除非个人资质出类拔萃&#xff0c;如就职于国央企或事业单位&#xff0c;工龄逾年&#xff0c;五险一金完备…