关于HarmonyOS jsvm的api OH_JSVM_AddFinalizer问题,执行`OH_JSVM_AddFinalizer`和`OH_JSVM_ReferenceUnref`的效果并不完全等同于在V8中执行`setWeak`。
在HarmonyOS的jsvm中,`OH_JSVM_AddFinalizer`用于为一个JavaScript对象添加一个终结器回调,当这个JavaScript对象被垃圾回收时,会调用这个回调。而`OH_JSVM_ReferenceUnref`则用于减少一个引用的计数,当计数降到0时,通常意味着这个引用可以被垃圾回收(但这并不直接将其变为弱引用)。
V8中的`setWeak`允许你将一个对象设置为弱引用,这样即使没有其他强引用指向它,垃圾回收器仍然可以在需要时回收它,并且可以在对象被回收时执行一个回调函数。
在HarmonyOS的jsvm中,虽然你可以通过`OH_JSVM_ReferenceUnref`减少引用计数,但这并不直接等同于V8中的弱引用机制。要模拟类似V8中`setWeak`的行为,你可能需要结合使用`OH_JSVM_AddFinalizer`和适当的引用管理逻辑,以便在对象即将被回收时执行必要的清理操作。
然而,`OH_JSVM_AddFinalizer`的回调是在对象被垃圾回收时调用的,而不是在对象变为弱引用时调用的,因此它不能精确模拟V8中`setWeak`的弱引用回调行为。如果你需要在对象变为弱引用时执行某些操作,你可能需要设计自己的机制来跟踪和管理这些对象的引用状态。
在OH_JSVM_Wrap中设置 JSVM_Finalize finalizeCb后,在执行OH_JSVM_RemoveWrap后,才会回调finalizeCb。请参见 OH_JSVM_Wrap接口定义:
JSVM_EXTERN JSVM_Status OH_JSVM_Wrap (JSVM_Env env, JSVM_Value jsObject,
void *nativeObject, JSVM_Finalize finalizeCb,
void finalizeHint, JSVM_Ref result) OH_JSVM_RemoveWrap()
OH_JSVM_RemoveWrap接口定义:
JSVM_EXTERN JSVM_Status OH_JSVM_RemoveWrap (JSVM_Env env, JSVM_Value jsObject, void ** result )
这两个接口说明,请参考:
https://developer.huawei.com/consumer/cn/doc/harmonyos-refere...
用法类似napi_remove_wrap的使用。
请参考:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...
reference count降到0,不会调用JSVM_Finalize finalizeCb中定义的回调。
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。