检查程序中 retain() 和 release() 的出现次数是否匹配

cocos2d(-x) 包含了 autorelease 实现,大多数时候用起来都非常方便。

不过程序中的 retain() 和 release() 需要有相同的调用次数,疏忽就可能导致对象无法释放或重复删除。

下面的脚本简单的检查代码中的 retain() 和 release() 出现次数是否一致:

#!/bin/sh

FILES=`find . -type f | grep "\.cpp"`

for f in $FILES
do
    RETAIN_COUNT=`grep -c "\<retain()" $f`
    RELEASE_COUNT=`grep -c "\<release()" $f`

    if [ "$RETAIN_COUNT" -ne "$RELEASE_COUNT" ]
    then
        echo "## FILE \"$f\" WARNING: retain() = $RETAIN_COUNT, release() = $RELEASE_COUNT"
        grep -n "\<retain()" $f
        echo "---------------- release ----------------"
        grep -n "\<release()" $f
        echo
    fi
done

使用:

$ cd Classes
$ check_retain

## FILE "./Scenes/LayerPlaySurvivalMode.cpp" WARNING: retain() = 3, release() = 2
29:    m_session->retain();
32:    m_player->retain();
322:    m_activeProperty->retain();
---------------- release ----------------
90:    m_session->release();
376:    m_activeProperty->release();

从输出结果很容易看到遗漏了一个 m_player->release()。

当然,很多时候 retain() 和 release() 的出现次数并不一样,所以不能认为输出结果就一定代表程序有问题。

Xcode 真机调试出现 The argument is invalid

连上设备调试,出现错误信息“The argument is invalid.”。检查了所有的 build settings 都没问题,百思不得其解。

Google 一番,发现这个问题是因为源代码或者资源目录中存在符号连接造成的。符号连接在模拟器中工作正常,但在真机上就不行了。

在终端窗口进入项目目录,使用命令:

find ./ -type l -exec ls -l {} \;

就可以列出项目目录中所有的符号连接。然后删除这些符号连接,并把需要的目录拷贝到项目目录中,再调试就完全正常了。

不过这样一来,实在有点不方便,特别是我们几个项目都是共享同一份引擎和框架代码。开发中难免根据项目需求对引擎和框架进行修改,或者解决其中存在的问题。不能使用符号连接,同步几个项目的源代码就很容易出错了。

解决 Cocos2d-x 与 Lua 配合的内存问题

Cocos2d-x 内置了对 Lua 的支持,不过实际使用时存在一些问题,会导致 Lua 端无法正确访问对象属性和方法。

问题根源与表现

Cocos2d-x 采用 tolua++ 来实现 C++ 和 Lua 的交互。具体实现上,tolua++ 使用 Lua userdata(又称为 usertatum)来保存 C++ 对象的指针,并通过 metatable 让 Lua 代码可以访问 C++ 对象的属性和方法。

对于每一个需要暴露给 Lua 的 C++ class,tolua++ 会以 C++ class name 创建一个 metatable,并在 metatable 中添加一个 tolua_ubox 字段。tolua_ubox 字段则是一个表格,映射 C++ 对象指针到对象的 usertatum。usertatum 中保存了 C++ 对象指针。

Continue reading ‘解决 Cocos2d-x 与 Lua 配合的内存问题’

将 Lua 模块编译为 C 代码

将 Lua 源代码直接放入最终产品,显然不是个理想选择。利用 LOOP 提供的 Precompiler 工具,可以将 Lua 模块编译为 C 代码。 Continue reading ‘将 Lua 模块编译为 C 代码’




Switch to our mobile site