有人可以解释为什么在这里保留和释放?我无法看到它是必要的。
代码如下,谢谢。
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();
}
}
答案 0 :(得分:0)
您应该看到函数removeObjectForElement(pElement)
的功能详情。
如果函数removeObjectForElement将访问指针pTmpObj指向的字段,则保留pTmpObj更安全。
如果pTmpObj指向的对象被另一个过程释放,则在此处调用removeObjectForElement
方法时可能会出现BAD_ACCESS错误。
答案 1 :(得分:0)
Cocos2d-x容器(CCDictionary
,CCArray
)retain
添加时的对象,以及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
将成为垃圾指针。