Cocos2d x 是否需要保留/释放CCObject的耦合?

Cocos2d x 是否需要保留/释放CCObject的耦合?,cocos2d-x,Cocos2d X,有人能解释为什么在这里保留和释放吗?我看不出这有必要 代码如下,谢谢 void CCDictionary::setObject(CCObject* pObject, const std::string& key) { CCAssert(key.length() > 0 && pObject != NULL, "Invalid Argument!"); if (m_eDictType == kCCDictUnknown) {

有人能解释为什么在这里保留和释放吗?我看不出这有必要

代码如下,谢谢

void CCDictionary::setObject(CCObject* pObject, const std::string& key) {
    CCAssert(key.length() > 0 && pObject != NULL, "Invalid Argument!");
    if (m_eDictType == kCCDictUnknown)
    {   
        m_eDictType = kCCDictStr;
    }   

    CCAssert(m_eDictType == kCCDictStr, "this dictionary doesn't use string as key.");

    CCDictElement *pElement = NULL;
    HASH_FIND_STR(m_pElements, key.c_str(), pElement);
    if (pElement == NULL)
    {   
        setObjectUnSafe(pObject, key);
    }   
    else if (pElement->m_pObject != pObject)
    {   
        CCObject* pTmpObj = pElement->m_pObject;
        pTmpObj->retain();
        removeObjectForElememt(pElement);
        setObjectUnSafe(pObject, key);
        pTmpObj->release();
    }   
}

您应该看到函数
removeObjectForElement(pElement)
的详细功能

如果函数removeObjectForElement将访问指针pTmpObj指向的字段,则保留pTmpObj更安全

如果pTmpObj指向的对象被另一个过程释放,则在此处调用
removeObjectForElement
方法时,可能会出现错误的访问错误。

CoCoCos2D-x容器(
CCDictionary
CCArray
在添加对象时保留它,当物体从容器中取出时,
释放
。容器本身是另一个结构ccArray或uthash的接口,该结构不使用cocos2d-x的参考计数系统,并使用原始数据而不是
CCObject
s进行操作

大多数cObject都是
autorelease
d。自动删除对象在更新周期结束时删除,如果其引用计数器达到1(仅由自动删除对象列表保留)。自动释放的对象可以安全地从容器中删除,然后在单个更新周期内添加到另一个容器中

但若对象并没有自动删除,那个么当引用计数器达到0时,它会立即被删除。所以,当cocos2d-x容器调用
release
时,可以删除对象,但对象的指针仍然可以存储在uthash或ccArray中

为了防止对象被删除,当数据结构存储它的指针时,我们
保留
对象,然后
在过程结束时释放

例如,当我们将节点从一个父节点移动到另一个父节点时,也应使用此模式:

node->retain();
node->removeFromParent();
newRoot->addChild(node);
node->release();
通常,节点是自动释放的,这样移动是安全的。但若节点未自动删除,
removeFromParent
调用可以删除它,并且
node
将成为垃圾指针