c++代码中创建的原生层对象 addchild 到JS脚本层对象(jsObject)中后,jsObject的children个数为0,而jsObject.__sgNode.children个数为实际个数。退出界面的时候会出现Invalid Native Object。
请问有没有什么解决方法或规避方法。谢谢!!
有部分界面必须通过C++来创建这个必须要这么做的,项目所需。
c++代码中创建的原生层对象 addchild 到JS脚本层对象(jsObject)中后,jsObject的children个数为0,而jsObject.__sgNode.children个数为实际个数。退出界面的时候会出现Invalid Native Object。
请问有没有什么解决方法或规避方法。谢谢!!
有部分界面必须通过C++来创建这个必须要这么做的,项目所需。
可以尝试一下 1.3 版本,新的内存模型中应该不会出现 Invalid Native Object 错误。另外,可以发一下相关的代码片段看一下
pan大,目前用的版本就是1.31的。但我把CC_ENABLE_GC_FOR_NATIVE_OBJECTS设为0了,也就是说没有使用新的内存模型。
C++返回对象给脚本层的代码:
JS_BINDED_FUNC_IMPL(JsbBingoC, createBattleLayer)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
if (argc >= 2)
{
bool ok = true;
std::string battleString;
ok &= jsval_to_std_string(cx, args.get(0), &battleString);
std::string processString;
ok &= jsval_to_std_string(cx, args.get(1), &processString);
cocos2d::Node* cobj = createBattle(battleString, processString);
js_type_class_t *typeClass = js_get_type_from_native<cocos2d::Node>(cobj);
JS::RootedObject jsobj(cx, jsb_ref_create_jsobject(cx, cobj, typeClass, "cocos2d::Node"));
args.rval().set(OBJECT_TO_JSVAL(jsobj));
return true;
}
JS_ReportError(cx, "invalid call: %s", __FUNCTION__);
return false;
}
脚本层将所得对象和脚本对象关联:
…
var battleNode = new cc.Node(“Battle”);
battleNode._sgNode = BingoJsb.createBattleLayer(battleString, processString);;
this.battleLayer.addChild(battleNode);
我修改了下,把脚本层对象作为参数传到c++层,在C++层addchild,貌似就没有问题,应该autorelease的原因,在脚本层还没有addchild的时候,就已经被release了。
不过这还是在使用旧的内存模型的情况下。如果使用新的内存模型,会有几种异常情况出现,在堆栈中也看不到有效信息,出现的时候截几张图上来。