v8持久setWeak回调未被调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了v8持久setWeak回调未被调用相关的知识,希望对你有一定的参考价值。

使用Google的v8 C ++库,我尝试在堆上创建一个v8 :: UniquePersistent实例,该实例包含一个内部指针,指向一些在C ++中分配的内存,并在Persistent上调用SetWeak()来指定一个回调,这将执行通过释放持久化内部指针指向的内存指针,当javascript引擎不再需要该句柄时,进行必要的清理。尽管Persistent的创建似乎有效,但我发现我的回调函数永远不会被调用。

我完全被这里难住了。我有什么想法可能做错了吗?

答案

仅当对象被垃圾回收时才调用回调。试试这个例子:

void callback(v8::WeakCallbackData<v8::Object, int> data)

   Local<Object> val = data.GetValue();
   int* ptr = retinterpret_cast<int*>(val->GetAlignedPointerFromINternalField(0));
   delete ptr;
   fprintf(stdout, "Deleted internal object!\n");


void main()

  using namespace v8;

  // Enable garbage collection
  const char* flags = "--expose_gc";
  v8::V8::SetFlagsFromStrings(flags, strlen(flags));

  Isolate isolate = Isolate::New();
  isolate->Enter();
  HandleScope scope(isolate);
  Eternal<v8::Context> context;
  Local<ObjectTemplate> ctx_template  ObjectTemplate::New(isolate);
  context.Set(isolate, Context::New(isolate, nullptr, ctx_template);

  Local<ObjectTemplate> obj_template = ObjectTemplate::New(isolate);
  obj_template->SetInternalFieldCount(1);
  Local<Object> obj = Local<Object>(isolate, obj_template->NewInstance());
  obj->SetAlignedPointerInInternalField(0, new int);
  UniquePersistent<Object> persistent(isolate, obj);
  persistent->SetWeak(nullptr, callback);

  //...do something with persistent

  persistent.Reset();

  isolate->RequestGarbageCollectionForTesting(v8::Isolate::kFullGarbageCollection);
  // You should see output from the callback
  // i need to add more words to pass edit word num check...

以上是关于v8持久setWeak回调未被调用的主要内容,如果未能解决你的问题,请参考以下文章

SDCAlertView 回调 clickButtonAtIndex 在 iOS 运行时未被调用

图解 Google V8 # 17:消息队列:V8是怎么实现回调函数的?

为啥这个函数调用的执行时间会发生变化?

awakeFromNib 被调用,viewDidLoad 未被调用

V8引擎静态库及其调用方法

C++通过V8调用js函数