
弱引用在HarmonyOS上的使用
开发者需要依靠弱引用解决垃圾回收相关的内存管理问题。
- 强引用:默认的引用类型,被强引用的对象不会被垃圾回收。
- 弱引用:允许对象在没有其他强引用时被垃圾回收,不会阻止垃圾回收器回收该对象。
场景一:使用弱引用打破循环引用,确保对象能够被垃圾回收。
循环引用
只要这个循环引用存在,即使外部没有这两个对象的强引用,它们也不会被垃圾回收。
使用弱引用打破循环引用
由于使用了WeakRef弱引用,只要没有其他强引用指向这个两个对象,它们就可以被垃圾回收,只要有一方使用弱引用,即可解除两者的循环引用。
场景二:WeakMap和WeakSet仅持有对对象的弱引用,和WeakRef一样它们也不会阻止垃圾回收。
WeakSet和WeakMap都是用于存储弱引用的集合类型,WeakSet存储对象,WeakMap存储键值对。
与WeakRef的区别:WeakSet和WeakMap可用来保存引用对象,但不支持取出对象WeakRef支持存取对象。
WeakSet
不能从 WeakSet 中取出或获取某个对象,只能检查是否存在于集合中使用 WeakSet 存储对象并检查是否存在,可以依据这一特性判断对象是否被垃圾回收。
WeakMap
不能列出WeakMap中的所有键或值,只能通过已知的键来访问对应的值。使用WeakMap存储键值对并通过已知的键访问值。
WeakRef
用WeakRef创建对象的弱引用,支持在需要时获取原始对象,必须在对象仍然存在时才能获取,如果被回收需要重新创建,一般采用WeakRef的deref()方法获取原始对象。
场景三:弱引用的垃圾回收时机
WeakRef 主要用于允许对象被垃圾回收,但不保证对象何时会被回收,其垃圾回收时机是不确定的。
由于WeakRef不能检测对象何时被垃圾回收,没有提供与垃圾回收事件关联的回调机制,所以只能通过主动轮询的方式定期检查对象是否已经被回收。
HarmonyOS可用FinalizationRegistry实现类似监控对象生命周期的能力。
使用FinalizationRegistry注册对象后,当对象被垃圾回收时,会调用提供的回调函数。
