以下来自对 cocos2d-x-3.5 的源码分析, 今天重点研究它的动态开辟的对象释放问题.
涉及以下3个基本的class 和一个模板类
手动引用计数类
class RefRef是 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()
- 添加
- 任何一个
对象池管理员
PoolManagerPoolManager是单例的 !
static PoolManager* getInstance()
- 池子只能有压栈和退栈两个操作.
void push(AutoreleasePool *pool);void pop();
- 构造单例时候会自动构造一个
AutoreleasePool作为当前使用的池子. - 总是使用栈顶的池子.
模板类
RefPtr模拟shared_ptr- 支持
swap() - 自行测试NULL
- 自动累加/累减计数
- 可以相互赋值
- 支持
get()接口获取原始指针* , ->运算符
- 支持
另外还有一个相关的class : class Clonable .
* 支持接口 Clonable* clone() , 会复制Ref , 重新开始计数.
可以看到 cocos2d-x 提供了基本的管理机制 ,但是需要依赖程序员的自觉性!!!
基于Ref的继承体系速查
RefDirector
DisplayLinkDirector
EventListenerEventListenerAccelerationEventListenerControllerEventListenerCustomEventListenerFocusEventListenerKeyboardEventListenerMouseEventListenerTouchOneByOne
Event
EventDispatcherEventControllerEventFocusEventCustomEventKeyboardEventMouseEventTouch
SchedulerScriptHandlerEntryTouchActionManagerAction:Cloneable
FiniteTimeAction
ActionInstant
StopGrid
ActionInterval
GridAction
Grid3DActionTiledGrid3DActionAccelDeccelAmplitude
AccelAmplitudeDeccelAmplitudeActionEase
EaseBackInEaseBackInOutEaseBackOutEaseBezierActionEaseBounce
EaseBounceInEaseBounceInOut
EaseCircleActionInEaseCircleActionInOutEaseCircleActionOutEaseCubicActionInEaseCubicActionInOut
AnimateBezierByBezierToBlinkFadeTo
FadeInFadeOut
JumpBy
JumpTo
MoveBy
MoveTo
RepeatRepeatForeverReverseTimeRotateByRotateToScaleTo
ScaleBy
TintByTintToTargetedActionProgressFromToProgressToActionTween
SequenceSkewTo
SkewBy
Spawn
FollowSpeedActionCamera
OrbitCamera
PointArrayAnimationFrame : CloneableAnimation : CloneableAnimationCacheNode
CameraBaseLight
AmbientLightDirectionLightPointLightSpotLight
AtlasNode
LabelAtlas:LabelProtocolTileMapAtlas
ClippingNodeClippingRectangleNodeDrawNodeTMXLayerTMXTiledMapLabelTTF:LabelProtocol,BlendProtocolLabelBMFont:LabelProtocol,BlendProtocolLayer
LayerMultiplexLayerColor:BlendProtocol
LayerGradient
MenuMenuItemImageView
MenuItemSpriteMenuItemToggleMenuItemLabel
MenuItemAtlasFontMenuItemFontMenuItemFont
MotionStreak:TextureProtocolNodeGridRenderTextureParallaxNodeProtectedNode
Widget:LayoutParameterProtocol
ButtonCheckBoxLoadingBarSliderTextTextAtlasTextBMFontVideoPlayerWebViewLayout:LayoutProtocol
RelativeBoxPageViewHBoxVBoxScrollView
ListView
ParticleBatchNode:TextureProtocolParticleSystem:TextureProtocol
ParticleSystemQuad
ParticleExplosionParticleMeteorParticleFireParticleFireworksParticleFlowerParticleGalaxyParticleRainParticleSmokeParticleSnowParticleSpiralParticleSun
Scene
TransitionScene
TransitionCrossFadeTransitionFadeTransitionJumpZoomTransitionShrinkGrow:TransitionEaseSceneTransitionMoveInL:TransitionEaseScene
TransitionMoveInBTransitionMoveInRTransitionMoveInT
TransitionSceneOriented
TransitionFlipAngularTransitionFlipXTransitionFlipYTransitionZoomFlipXTransitionZoomFlipY
TransitionFadeTR:TransitionEaseScene
TransitionFadeDownTransitionFadeUp
TransitionSlideInL:TransitionEaseScene
TransitionSlideInRTransitionSlideInT
TransitionSplitCols:TransitionEaseScene
TransitionSplitRows
TransitionTurnOffTilesTransitionPageTurnTransitionProgress
Sprite:TextureProtocolSpriteBatchNode:TextureProtocol
TMXLayer
TMXTiledMap
Component
FontCharMapFontFNTFontFreeTypeLayoutComponent
FontAtlasGrabberGridBase
Grid3DTiledGrid3D
SpriteFrame:ClonableSpriteFrameCacheTMXObjectGroupTMXLayerInfoLayoutManagerRichElementGLView
本文深入探讨cocos2d-x-3.5版本中的内存管理机制,特别是Ref对象及其引用计数方法retain、release和autorelease的使用。同时介绍了AutoreleasePool和PoolManager的作用及其实现细节。

1673

被折叠的 条评论
为什么被折叠?



