原创作品,转载请标明:http://www.jb51.cc/article/p-yjmzlalc-ep.html
再看CCObject,剔除上节的拷贝相关,以及Lua脚本相关的属性和方法后,CCObject还剩下什么?
1.剩下什么?
可以看到整个CCObject就是围绕着m_uReference和m_uAutoReleaseCount在转。这两个变量的解释如下。所以CCObject剩下的其实就是对内存的管理。
- CCObject::CCObject(void)//构造函数
- :m_nLuaID(0)
- ,m_uReference(1)//引用计数,初始为1,当引用计数=0,自动释放该对象
- ,m_uAutoReleaseCount(0)//自动释放对象计数,如果是手动new的,则为0,如果autoRelease的,则在AutoreleasePool会+1
- //这里是保护成员,所以CCAutoreleasePool被声明为友元类
- {
- staticunsignedintuObjectCount=0;//静态成员,对象的计数,只增不减,用于标识唯一一个对象实例
- m_uID=++uObjectCount;
- }
- CCObject::~CCObject(void)
- if(m_uAutoReleaseCount>0)//如果是自动管理,则在PoolManager中删除
- CCPoolManager::sharedPoolManager()->removeObject(this);
- }
- //iftheobjectisreferencedbyLuaengine,removeit
- if(m_nLuaID)
- CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptObjectByCCObject(else
- CCScriptEngineProtocol*pEngine=CCScriptEngineManager::sharedManager()->getScriptEngine();
- if(pEngine!=NULL&&pEngine->getScriptType()==kScriptTypeJavascript)
- {
- pEngine->removeScriptObjectByCCObject(this);
- voidCCObject::release(//引用计数-1,如果引用计数=0,释放对象
- CCAssert(m_uReference>0,"referencecountshouldgreaterthan0");
- --m_uReference;
- if(m_uReference==0)
- deletethis;
- voidCCObject::retain(//引用计数+1,防止被对象释放
- CCAssert(m_uReference>0,"referencecountshouldgreaterthan0");
- ++m_uReference;
- CCObject*CCObject::autorelease(//对象加入PoolManager,自动管理
- CCPoolManager::sharedPoolManager()->addObject(return boolCCObject::isSingleReference(void)const//返回是否唯一引用
- returnm_uReference==1;
- unsignedintCCObject::retainCount(//返回引用计数
- returnm_uReference;
- boolCCObject::isEqual(constCCObject*pObject)//判断对象是否相等
- this==pObject;
- voidCCObject::acceptVisitor(CCDataVisitor&visitor)//辅助对象执行动作
- visitor.visitObject( }
2.内存管理
从CCObject可以看出,内存的管理方式有两种:手动管理和自动管理。
2.1.手动内存管理
想必从Java转到C++的朋友可能很受不了C++再申请完内存后还要手动释放,就像我从C++转Java时也同样很不习惯竟然不用管理内存,老是害怕会不小心让系统给销毁了。CCObject的成员变量m_uAutoReleaseCount标识了是手动管理还是自动管理。如果执行以下操作:
copy