cocos执行evalstring闪退问题

cocos项目原生平台调用JS的时候是执行evalstring函数,但是有时候会闪退,闪退原因主要如下

1.android下执行evalstring要在GL线程

  

 2.ios下执行evalstring要在主线程下执行,如果当前线程不是在cocos线程,要保证evalstring切换到cocos线程执行

  

提示:执行evalstring需要先导入头文件

#import "cocos/scripting/js-bindings/jswrapper/SeApi.h"

这里特别要注意performFunctionInCocosThread,之前执行这里的函数会闪退,要跟一下是否引用的外包变量被释放了,之前我是直接传code进去,但是在执行到cocos线程的回调之后,发现code被释放了,其地址的值被赋值为其他的值,执行evalstring异常。

这里要说明一下oc下的NSString和NSMutableString:NSString是一个不可变的字符串对象。这不是表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。而NSMutableString是可变的,意味着你可以追加它的内存空间,或者修改它所分配的内存空间中的值。

顺便说一下Lambda 函数与表达式:

Lambda 表达式本质上与函数声明非常类似。Lambda 表达式具体形式如下:

[capture](parameters)->return-type{body}

例如:

[](int x, int y){ return x < y ; }

如果没有返回值可以表示为:

[capture](parameters){body}

例如:

[]{ ++global_x; }

在一个更为复杂的例子中,返回类型可以被明确的指定如下:

[](int x, int y) -> int { int z = x + y; return z + x; }

本例中,一个临时的参数 z 被创建用来存储中间结果。如同一般的函数,z 的值不会保留到下一次该不具名函数再次被调用时。

如果 lambda 函数没有传回值(例如 void),其返回类型可被完全忽略。

在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。 与JavaScript闭包不同,C++变量传递有传值和传引用的区别。可以通过前面的[]来指定:

[]      // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

另外有一点需要注意。对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入:

[this]() { this->someFunc(); }();
原文地址:https://www.cnblogs.com/ring1992/p/14976307.html