CCObject、CCCopy 类的分析

我没有研究过其他版本,至少在这个版本中可以看到

CCObject::CCObject(void)
: m_nLuaID(0)
, m_uReference(1) // when the object is created, the reference count of it is 1
, m_uAutoReleaseCount(0)
{
    static unsigned int uObjectCount = 0;

    m_uID = ++uObjectCount;
}

CCObject::~CCObject(void)
{
    // if the object is managed, we should remove it
    // from pool manager
    if (m_uAutoReleaseCount > 0)
    {
        CCPoolManager::sharedPoolManager()->removeObject(this);
    }

    // if the object is referenced by Lua engine, remove it
    if (m_nLuaID)
    {
        CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptObjectByCCObject(this);
    }
    else
    {
        CCScriptEngineProtocol* pEngine = CCScriptEngineManager::sharedManager()->getScriptEngine();
        if (pEngine != NULL && pEngine->getScriptType() == kScriptTypeJavascript)
        {
            pEngine->removeScriptObjectByCCObject(this);
        }
    }
}



cocos2dx是原生支持lua和JavaScript脚本的。

在这个类里面,我们可以看到一个函数

CCObject* CCObject::copy()
{
    return copyWithZone(0);
}

当我去进行调用copy函数的时候发现出现中断,直接不明白,但是看到源码发现就有个   CC_UNUSED_PARAM(unusedparam) (void)unusedparam 操作,实际上这操作是空实现。


至于retain则是+1操作和断言控制,release则增加一次计数判断,这里我产生了一个疑问:为什么可以使用

delete this;
删除当前对象,而当前对象却没有使用过new的操作
void CCObject::release(void)
{
    CCAssert(m_uReference > 0, "reference count should greater than 0");
    --m_uReference;

    if (m_uReference == 0)
    {
        delete this;
    }
}



回头测试一下在未使用过new操作的类内部调用delete操作,内存中断了。但是回想一下cocos2dx官方鼓励的create模式操作,你会发现纯粹是因为两个对称操作完成闭包,鸡和蛋的关系缔造了这个语言风格。所以这里告诫同行各位:继承至CCObject族对象的创建能使用create操作就使用create,别直接声明对象,这样子会有内存泄露或者中断的风险。

明天继续补


继续,当最后看到一个函数时,怎么这么熟,有点

void CCObject::acceptVisitor(CCDataVisitor &visitor)
{
    visitor.visitObject(this);
}

NS_CC_END



这个访问函数对于我们这些基础不过关的可以认真看看,如果之后需要处理大量的数据时,这个函数应该是要认真关心的。原型如下:

class CC_DLL CCDataVisitor
{
public:
    virtual ~CCDataVisitor() {}

    /** default method, called from non-overloaded methods and for unrecognized objects */
    virtual void visitObject(const CCObject *p) = 0;

    virtual void visit(const CCBool *p);
    virtual void visit(const CCInteger *p);
    virtual void visit(const CCFloat *p);
    virtual void visit(const CCDouble *p);
    virtual void visit(const CCString *p);
    virtual void visit(const CCArray *p);
    virtual void visit(const CCDictionary *p);
    virtual void visit(const CCSet *p);
};



然后秒了一下底层还是用了C++的vector等stl函数实现的。至于有没有隐患,暂时我没有能力去分析,水平不够。//jingz,标记一下。



你可能感兴趣的:(C++,lua,cocos2dx,王敬哲)