zoukankan      html  css  js  c++  java
  • 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(); }();
  • 相关阅读:
    图形合并
    启动脚本
    图形合并
    :(){:|:&};:
    C言语教程第八章:列举,位运算(5)
    C言语图形情势编程,赋性鼠标(4)
    C言语教程第十章:文件(6)
    C言语教程第十章:文件(4)
    红帽为什么要连结桌面Linux
    阶乘较劲争论器改善版
  • 原文地址:https://www.cnblogs.com/ring1992/p/14976307.html
Copyright © 2011-2022 走看看