cocos2d-x3.3Final源代码学习日记-Ref类
cocos2d-x3.3Final源代码学习日记 前言: 2015年了,大三第一个学期正式结束了,按我们学校的归定,再加上自己的选修的课程,或许自己这一生在学校学习的机会也就仅仅剩下一个学期了。所以自己也是很希望能通过最后一个学期的努力,至少可以在实习的时间段找一份像样一点的工作。接触cocos2d-x已经快两年,但是真正决定往游戏开发这个方向走,还是在3.0版本的cocos2d-x发布之后的.原因很简单,在自己学过的这么多门编程语言里,我最偏爱C++. 正式开始学习: 我们查看cocos2d-x的API文档会发现几乎所有的类都是继承一个叫Ref的类.我喜欢从最根源上面去开始了解一样东西: //////////////////////////////////////////////////////////////////////////////// Ref类 //////////////////////////////////////////////////////////////////////////////// classCC_DLLRef 删了一大堆的注释之外,发现其实这个Ref类也是很简单的嘛.按我学习c++的经验来: 一眼看过去发现了一个_referenceCount;这个东西相当熟悉, C++11里的智能指针就采用了种技术:(引用计数) 随便推测一下,Ref类应该和内存管理有关. 还有一个友元类:AutoreleasePool; 那我们跳转到CCRef.cpp里看一下,(对于学过C++的人来说,分离式编译应该很容易理解) Ref::Ref():_referenceCount(1){}看来推测没错,每当我们创建一个Ref对象时,与该对象绑定的_referneceCount就设置成1,当他变成0的时候就销毁对象,释放内存. unsignedintRef::getReferenceCount()const { return_referenceCount; } //返回引用计数, voidRef::retain() { CCASSERT(_referenceCount>0,"referencecountshouldgreaterthan0"); ++_referenceCount; } //断言宏CCASSERT的作用: CCASSERT(cond,msg); 如果cond为真,继续后面的代码,如果为假,返回MSG. Retain函数的作用就是让引用记数+1 voidRef::release() { CCASSERT(_referenceCount>0,"referencecountshouldgreaterthan0"); --_referenceCount; if(_referenceCount==0) { deletethis; } } release函数的作用就是让引用计数-1,并且判断他是否为0,如果为0就删除该对象. //把对象放到对象管理池当中 Ref*Ref::autorelease() { PoolManager::getInstance()->getCurrentPool()->addObject(this); returnthis; } 很明显的autorelease时应该和AutoreleasePool类,PoolManager类有关系。但是从名字上面看,我们应该可以看出,他是自动管理引用计数的,下次 继续看他是怎么自动管理引用计数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |