看object类的实现就行了。
首先映入眼帘的是它们:
protected:
/// count of references
unsigned int _reference;
/// count of autorelease
unsigned int _autoReleaseCount;
然后我们先看下_reference都在哪里被引用:
就是两个函数retain和release在修改它。
/**
* Retains the ownership.
*
* This increases the object's reference count.
*
* @see release, autorelease
* @js NA
*/
inline void retain()
{
CCASSERT(_reference > 0, "reference count should greater than 0");
++_reference;
}
/**
* Release the ownership immediately.
*
* This decrements the object's reference count.
*
* If the reference count reaches 0 after the descrement, this object is
* destructed.
*
* @see retain, autorelease
* @js NA
*/
inline void release()
{
CCASSERT(_reference > 0, "reference count should greater than 0");
--_reference;
if (_reference == 0)
delete this;
}
API提供的注释说的很清楚,retain增加引用,release减少,当减为0就释放,这种引用计数的方法到处可见,比如windows里对资源的管理。
但_autoReleaseCount怎么用的呢?
我们发现它是protected的,吐槽,改为【private的,用setter/getter比较友好。
这个东东是代码到处可见的addObejct里面会改变滴:
void AutoreleasePool::addObject(Object* object)
{
_managedObjectArray->addObject(object);
CCASSERT(object->_reference > 1, "reference count should be greater than 1");
++(object->_autoReleaseCount);
object->release(); // no ref count, in this case autorelease pool added.
}
看到上一篇文章的clone吗,就会调到这里:
Array* Array::clone() const
{
Array* ret = new Array();
ret->autorelease();
autorelease里面:
Object* Object::autorelease()
{
PoolManager::sharedPoolManager()->addObject(this);
return this;
}
void PoolManager::addObject(Object* object)
{
getCurReleasePool()->addObject(object);
}
void AutoreleasePool::addObject(Object* object)
{
_managedObjectArray->addObject(object);
CCASSERT(object->_reference > 1, "reference count should be greater than 1");
++(object->_autoReleaseCount);
object->release(); // no ref count, in this case autorelease pool added.
}
注意object在构造的时候
Object::Object()
: _luaID(0)
, _reference(1) // when the object is created, the reference count of it is 1
, _autoReleaseCount(0)
{
static unsigned int uObjectCount = 0;
_ID = ++uObjectCount;
}
两个引用是不一样的,程序里会适当地调用retain,不然在autorelease会释放一次,这要保证reference>0不然要被释放掉。
嗯,赶脚好麻烦,估计这部分要被干掉,用C++11自带的智能指针。
分享到:
相关推荐
cocos2d-x 3.0 人物行走 . 包里有代码和 图片资源.
这是我重新弄的cocos2d-x-3.0的类图.之前别人兄台弄的,有些不全面,有些地方错误.我这个可以说是最新的了.每个类添加了中文的详细注解,同时也添加了中文的类名称翻译.这样对cocos2d-x-3.0的框架比较好上手. 有兴趣的...
Cocos2d-x3.0正式版 练练看 源码。有注释。
兄弟连cocos2d-x3.0 final视频教程 1.Cocos2d-x手机游戏开发C编程基础 2.Cocos2d-x手机游戏开发C++编程基础 3.Cocos2d-x3.0 final手机游戏开发核心技术 4.实例:贪吃蛇 5.实例:微信飞机大战
这是cocos2d-x 3.0 类关系图, 这个制作者是:gamecocos2dx 他做的Xmind,我导出的PNG格式,我推荐还是看Xmind,里面还有一些注释 gamecocos2dx Xmind下载地址:...
这是一个cocos2d-x 3.0中文开发文档.
http://blog.csdn.net/zoyzn/article/details/27251633一文的源码。cocos2d-x 3.0导出自定义类到lua,并导出自定义类的名称空间到lua。
cocos2d-x 3.0 骨骼动画 demo 以及注意事项
cocos2d-x 3.0 rapidjson 读取Json
本游戏基于cocos2d-x 3.0版本,可能不适用于cocos2d-x 2.x版本,请看清楚,再参考! 使用方法:将Classes中的类全部拷贝到新建cocos项目的Classes项目中,将Resources下的所有文件拷贝到对应的文件下,运行即可!
Cocos2d-x-3.x游戏开发之旅-钟迪龙著 全新pdf版和附书代码(代码为工程文件,可复制) 附带目录标签
x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台发布、程序代码管理、...
官网中文docs文档的例子下载 创建工程的时候一定要创建一样的文件名 http://www.cocos2d-x.org/docs/tutorial/framework/native/how-to-drag-and-drop-sprites/zh
Cocos2d-x3.0final 自学教程的配套代码http://blog.csdn.net/column/details/cocos2dx2014.html
cocos2d-x 3.0 开发文档英文版(html)
Cocos2d-x3.0游戏实例《别救我》源码。 教程地址:http://blog.csdn.net/musicvs/article/details/24928929
Cocos2d-x 3.0 过渡学习 尊重原创,转载来自:star特530的CSDN博客 :http://blog.csdn.net/star530?viewmode=contents
cocos2d-x 3.0 离线文档 html版
cocos2d-x 3.0-alpha0 SDK头文件和DLL文件