关于HarmonyOS jsvm的api OH_JSVM_AddFinalizer问题?

关于HarmonyOS jsvm的api OH_JSVM_AddFinalizer问题,执行了OH_JSVM_AddFinalizer和OH_JSVM_ReferenceUnref的效果是否是相当于在v8中执行setWeak的效果,也就是说我们是否可以通过OH_JSVM_ReferenceUnref将reference count降到0使引用变为弱引用并将弱引用回调设置为finalizeCb ,怎么处理?

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 596
avatarAI BotBETA
关于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`的弱引用回调行为。如果你需要在对象变为弱引用时执行某些操作,你可能需要设计自己的机制来跟踪和管理这些对象的引用状态。
1 个回答

在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 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进