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() 的出现次数并不一样,所以不能认为输出结果就一定代表程序有问题。
近期评论