以下来自对 cocos2d-x-3.5 的源码分析,今天重点研究它的动态开辟的对象释放问题.
涉及以下3个基本的class 和一个模板类
手动引用计数类 class Ref
Ref 是 cocos2d 中很大一部分类的祖先类 .
Ref 支持以下三个接口:
retain() 累加引用计数,当我们将指针复制给新的指针的时候,请自觉手动调用!
release() 指针释放无用或者即将挪作它用之前,自己自觉手动调用!
autorelease() 将释放的任务交给当前的 AutoreleasePool ,这样程序员就不需要在意这个指针什么时候被释放或者挪作它用了.
Ref 对象池 AutoreleasePool
- 任何一个
AutoreleasePool 对象构造的时候就会被压栈到下面的PoolManager 中,析构的时候自动退栈 .
AutoreleasePool 会在 clear 或者析构的时候将自己管理的Ref 自动release() 一下.
AutoreleasePool 支持:
- 添加
void addObject(Ref *object)
- 查询
bool contains(Ref* object) const
- 清除
void clear()
对象池管理员PoolManager
PoolManager 是单例的 !
static PoolManager* getInstance()
- 池子只能有压栈和退栈两个操作.
void push(AutoreleasePool *pool);
void pop();
- 构造单例时候会自动构造一个
AutoreleasePool 作为当前使用的池子.
- 总是使用栈顶的池子.
模板类RefPtr 模拟shared_ptr
- 支持
swap()
- 自行测试NULL
- 自动累加/累减计数
- 可以相互赋值
- 支持
另外还有一个相关的class : class Clonable . * 支持接口 Clonable* clone() ,会复制Ref ,重新开始计数.
可以看到 cocos2d-x 提供了基本的管理机制,但是需要依赖程序员的自觉性!!!
基于Ref的继承体系速查
Ref
Director
EventListener
EventListenerAcceleration
EventListenerController
EventListenerCustom
EventListenerFocus
EventListenerKeyboard
EventListenerMouse
EventListenerTouchOneByOne
Event
EventDispatcher
EventController
EventFocus
EventCustom
EventKeyboard
EventMouse
EventTouch
Scheduler
ScriptHandlerEntry
Touch
ActionManager
Action : Cloneable
FiniteTimeAction
ActionInstant
ActionInterval
GridAction
Grid3DAction
TiledGrid3DAction
AccelDeccelAmplitude
AccelAmplitude
DeccelAmplitude
ActionEase
EaseBackIn
EaseBackInOut
EaseBackOut
EaseBezierAction
EaseBounce
EaseBounceIn
EaseBounceInOut
EaseCircleActionIn
EaseCircleActionInOut
EaseCircleActionOut
EaseCubicActionIn
EaseCubicActionInOut
Animate
BezierBy
BezierTo
Blink
FadeTo
JumpBy
MoveBy
Repeat
RepeatForever
ReverseTime
RotateBy
RotateTo
ScaleTo
TintBy
TintTo
TargetedAction
ProgressFromTo
ProgressTo
ActionTween
Sequence
SkewTo
Spawn
Follow
Speed
ActionCamera
PointArray
AnimationFrame : Cloneable
Animation : Cloneable
AnimationCache
Node
Camera
BaseLight
AmbientLight
DirectionLight
PointLight
SpotLight
AtlasNode
LabelAtlas : LabelProtocol
TileMapAtlas
ClippingNode
ClippingRectangleNode
DrawNode
TMXLayer
TMXTiledMap
LabelTTF : LabelProtocol ,BlendProtocol
LabelBMFont : LabelProtocol ,BlendProtocol
Layer
LayerMultiplex
LayerColor : BlendProtocol
Menu
MenuItem
ImageView
MenuItemSprite
MenuItemToggle
MenuItemLabel
MenuItemAtlasFont
MenuItemFont
MenuItemFont
MotionStreak : TextureProtocol
NodeGrid
RenderTexture
ParallaxNode
ProtectedNode
Widget : LayoutParameterProtocol
Button
CheckBox
LoadingBar
Slider
Text
TextAtlas
TextBMFont
VideoPlayer
WebView
Layout : LayoutProtocol
RelativeBox
PageView
HBox
VBox
ScrollView
ParticleBatchNode : TextureProtocol
ParticleSystem : TextureProtocol
ParticleSystemQuad
ParticleExplosion
ParticleMeteor
ParticleFire
ParticleFireworks
ParticleFlower
ParticleGalaxy
ParticleRain
ParticleSmoke
ParticleSnow
ParticleSpiral
ParticleSun
Scene
TransitionScene
TransitionCrossFade
TransitionFade
TransitionJumpZoom
TransitionShrinkGrow : TransitionEaseScene
TransitionMoveInL : TransitionEaseScene
TransitionMoveInB
TransitionMoveInR
TransitionMoveInT
TransitionSceneOriented
TransitionFlipAngular
TransitionFlipX
TransitionFlipY
TransitionZoomFlipX
TransitionZoomFlipY
TransitionFadeTR : TransitionEaseScene
TransitionFadeDown
TransitionFadeUp
TransitionSlideInL : TransitionEaseScene
TransitionSlideInR
TransitionSlideInT
TransitionSplitCols : TransitionEaseScene
TransitionTurnOffTiles
TransitionPageTurn
TransitionProgress
Sprite : TextureProtocol
SpriteBatchNode : TextureProtocol
TMXTiledMap
Component
FontCharMap
FontFNT
FontFreeType
LayoutComponent
FontAtlas
Grabber
GridBase
SpriteFrame : Clonable
SpriteFrameCache
TMXObjectGroup
TMXLayerInfo
LayoutManager
RichElement
GLView
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|