- 什么时候需要使用JSValueProtect保证JSValueRef不被释放?
当把JSValueRef保存在堆内存中时,需要对JSValueRef使用JSValueProtect,否则此JSValueRef有可能被GC,导致crash
巨坑示例:
JSValueRef* values = new JSValueRef[3];
for (int i = 0; i < 3; ++i) {
// 这里由于是放堆上面,values[0]可能在i=1时,触发GC被释放
values[i] = JSMakeNumber(ctx, 123);
}
JSValueRef arr = JSObjectMakeArray, ctx, 3, values, nulptr);
- 放在栈上的 JSValueRef 实例并立即使用的场景是否需要使用JSValueProtect?
不需要,栈上的 JSValueRef 会在GC时加到root引用中,不会释放
示例:
// 栈上内存不会被GC
JSValueRef value = JSValueMakeNumber(ctx, 1);
JSObjectCallAsFunction, ctx, func, nullptr, 1, &value, nullptr);
-
JSCore 如何发现栈上的 JSValueRef ?
JSCore 会通过栈顶和栈底的指针,对栈上内存进行扫描,如果其值在heap中有记录,那么GC时认为此对象可达,不会GC。 -
GC 何时运行?
理论上任何 JSCore 相关调用都可能触发 GC,比如 JSMakeValue、JSObjectCallAsFunction 等等 -
GC 在哪个线程运行?
GC 可以在调用 JSCore API 的线程或者独立的GC线程中运行