需要保留/释放CCObject对吗?

时间:2014-03-12 09:28:20

标签: cocos2d-x

有人可以解释为什么在这里保留和释放?我无法看到它是必要的。

代码如下,谢谢。

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();
    }   
}

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

Cocos2d-x容器(CCDictionaryCCArrayretain添加时的对象,以及release从容器中删除对象时的对象。容器本身是另一个结构的接口,ccArray或uthash,它不使用cocos2d-x的引用计数系统,而是使用原始数据而不是CCObject来运行。

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

但是如果对象没有自动释放,那么当引用计数器命中0时它立即被删除。因此,当cocos2d-x容器调用release时,可以删除对象,但是对象的指针仍然可以存储在uthash或ccArray中。

为了保护对象不被删除,当数据结构存储它的指针时,我们retain对象,然后在程序结束时release它。

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

node->retain();
node->removeFromParent();
newRoot->addChild(node);
node->release();

通常,节点是自动释放的,以这种方式移动它是安全的。但是,如果节点未自动释放,removeFromParent调用可以删除它,node将成为垃圾指针。