C++代码中创建的原生层对象释放时会Invalid Native Object

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了。

不过这还是在使用旧的内存模型的情况下。如果使用新的内存模型,会有几种异常情况出现,在堆栈中也看不到有效信息,出现的时候截几张图上来。