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
将成为垃圾指针