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是怎么实现回调函数的?