
概述一、Cocos2d-x拷贝机制 1.CCCopying CCObject从CCCopying继承而来,而CCCopying拥有唯一的一个成员函数copyWithZone,这个函数可以认为是拷贝的一个协议,所有继承CCObject需要实现拷贝功能可以通过它来实现,源码: CCObject* CCCopying::copyWithZone(CCZone* pZone) { CC_UNUSE 一、Cocos2d-x拷贝机制
1.CCcopying CCObject从CCcopying继承而来,而CCcopying拥有唯一的一个成员函数copyWithZone,这个函数可以认为是拷贝的一个协议,所有继承CCObject需要实现拷贝功能可以通过它来实现,源码: CCObject* CCcopying::copyWithZone(CCZone* pZone) {
CC_UNUSED_ParaM(pZone); CCAssert(0.”not implement”); return 0; } 2.CCObject子类拷贝 CCObject* CCObject::copy() { return copyWithZone(0); } 3.CCArry 3.1 CCArray拷贝 CCArray* CCArray::createWithArray(CCArray* otherArray) { CCArray* pRet = (CCArray *)otherArray->copy(); pRet->autorelease(); return pRet; } 3.2 copyWithZone实现 CCObject* CCArray::copyWithZone(CCZone* pZone) { CCAssert(pZone == NulL,”CCArray should not be inherited.”); CCArray* pArray = new CCArray(); pArray->initWithCapacity(this->data->num>0?this->data->num:1); CCObject* pObj = NulL; CCObject* pTmpObj = NulL; CCARRAY_FOREACH(this,pObj)//遍历CCArray成员 { pTmpObj = pObj->copy(); pArray->addobject(pTmpObj); pTmpObj->release(); } return pArray; } 3.3 深拷贝和浅拷贝 Cocos2d-x采用的都是深拷贝的方式,它们的区别在于当前对象是否包含了对其他资源的引用;在拷贝机制上采用深拷贝的方式,大大方便了我们对内存的管理,避免因资源的释放导致引用异常。
二、继续内存管理机制
1.源码: CCObject::CCObject(voID) :m_nLuaID(0) ,m_uReference(1) //引用计数,初始为1,当引用计数为0,自动释放该对象 ,m_uautoReleaseCount(0)//自动释放对象计数,如果是手动new的,则为0,如果autoRelease的,则在autoreleasePool会+1 //这里是保护成员,所以CCautoreleasePool被声明为友元类 { static unsigned int uObjectCount = 0;//静态成员,对象计数,只增不减,用于标识唯一一个对象实例 m_uID = ++uObjectCount; } CCObject::~CCObject(voID) { if(m_uautoReleaseCount>0)//如果是自动管理,则在PoolManager中删除 { CCPoolManager::sharedPoolManager()->removeObject(this); } if(m_nLuaID) { ccScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptObjectByCCOb ject(this); } else { ccScriptEngineProtocol* pEngine = ccScriptEngineManager::sharedManager()->getScriptEngine(); if(pEngine != NulL && pEngine->getScriptType() == kScriptTypeJavaScript) { pEngine->removeScriptObjectByCCOb ject(this); } } } voID CCObject::release(voID) { CCAssert(m_uReference>0,”reference count should greater than 0”); —m_uReference; if(m_uReference == 0) { delete this; } } voID CCObject::retain(voID) { CCAssert(m_uReference > 0,”reference count should greater than 0”); ++m_uReference; } CCObject* CCObject::autorelease(voID) { CCPoolManager::sharedPoolManager()->addobject(this); return this; } bool CCObject::isSingleReference(voID) const { return m_uReference == 1; } unsigned int CCObject::retainCount(voID) const { return m_uReference; } bool CCObject::isEqual(const CCObject* pObject) { return this == pObject; } voID CCObject::acceptVisitor(CcdataVisitor &visitor) { visitor.visitObject(this); }
2.new和release是好基友,在手动内存管理中使用; 3.retain和release也是好基友,在自动内存管理中使用; 4.addChild(background)是要对引用计数进行 *** 作的; 总结 以上是内存溢出为你收集整理的Cocos2d-x::内存管理全部内容,希望文章能够帮你解决Cocos2d-x::内存管理所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)