当前位置:编程学习 > wap >>

Cocos2Dx 内存管理封装

刚接触Cocos2Dx感觉,架构比较清晰合理,但就是内存管理机制对于本人来说实在是感觉很奇怪。

每次创建对象都是用creatXXX方法,如果要保持对象指针还需要retain,销毁时还要记得release,着实很烦人。

本人尝试了使用类似智能指针的方式存储,感觉还不错。

 

先说一下原先Cocos2Dx自动内存管理机制:

    在Cocos2Dx的CCObject类中有这么两个函数retain、release,和一个变量m_uReference,用于控制引用计数,当调用一次retain 引用计数加一,当调用release时引用计数减一、如果此时引用计数为0则delete,另外还有一个函数autorelease,这个函数会在所以的静态工厂方法中调用(CCXXX::create()),此方法的作用是将对象放入内存管理池(CCPoolManage)而在每一帧结束时清除,引用计数为1(只有内存管理池拥有的)的对象。

    在官方的例子中可以看出不希望开发者手工管理内存(new),但是如果自动管理就必须每时每刻记得retain、release,否则要么是野指针要么就会内存泄露,如果在项目后期才注意此问题,那时可能已经无力回天了。

    所以我写了一个类似智能指针的模版解决此问题,不废话了,上代码:

 

[cpp]
#ifndef _CCPTR_H_  
#define _CCPTR_H_  
NS_CC_BEGIN 
 
template<class _Ty> 
class CCPtr 
{    
public: 
    typedef CCPtr<_Ty> _Myt; 
 
    explicit CCPtr(_Ty *_Ptr = 0) 
        : _Myptr(_Ptr) 
    {    
        CC_SAFE_RETAIN(_Myptr); 
    } 
 
    explicit CCPtr(_Myt const & _Ref) 
        : _Myptr(_Ref.get()) 
    { 
        CC_SAFE_RETAIN(_Myptr); 
    } 
 
    _Myt& operator=(_Myt& _Right) 
    { 
        _Ty* ptr = _Right.get(); 
        CC_SAFE_RETAIN(ptr); 
        CC_SAFE_RELEASE(_Myptr); 
        _Myptr = ptr; 
 
        return (*this); 
    } 
 
    _Myt& operator=(_Ty* ptr) 
    { 
        CC_SAFE_RETAIN(ptr); 
        CC_SAFE_RELEASE(_Myptr); 
        _Myptr = ptr; 
 
        return (*this); 
    } 
 
    template<class _Other> 
    operator CCPtr<_Other>() 
    { 
        return (CCPtr<_Other>(*this)); 
    } 
 
    template<class _Other> 
    _Myt& operator=(CCPtr<_Other>& _Right) 
    { 
        _Other* ptr = _Right.get(); 
        CC_SAFE_RETAIN(ptr); 
        CC_SAFE_RELEASE(_Myptr); 
        _Myptr = ptr; 
 
        return (*this); 
    } 
 
    template<class _Other> 
    CCPtr(CCPtr<_Other>& _Right) 
        : _Myptr(_Right.get()) 
    { 
        CC_SAFE_RETAIN(_Myptr); 
    } 
 
    ~CCPtr()  
    { 
        CC_SAFE_RELEASE(_Myptr); 
    } 
 
    _Ty& operator*() const 
    { 
        return (*get()); 
    } 
 
    _Ty *operator->() const  
    { 
        return (get()); 
    } 
 
    _Ty *get() const  
    { 
        return (_Myptr); 
    } 
 
private: 
    _Ty *_Myptr;    // the wrapped object pointer  
}; 
 
 
template<class T, class U> inline bool operator==(CCPtr<T> & a, CCPtr<U> & b)  
{  
    return a.get() == b.get();  
}  
 
template<class T, class U> inline bool operator!=(CCPtr<T> & a, CCPtr<U> & b)  
{  
    return a.get() != b.get();  
}  
 
typedef CCPtr<CCAction> CCActionPtr; 
typedef CCPtr<CCActionInterval> CCActionIntervalPtr; 
typedef CCPtr<CCActionCamera> CCActionCameraPtr; 
typedef CCPtr<CCActionManager> CCActionManagerPtr; 
typedef CCPtr<CCActionEase>  CCActionEasePtr; 
typedef CCPtr<CCPageTurn3D>  CCActionPageTurn3DPtr; 
typedef CCPtr<CCGridAction>  CCActionGridPtr; 
typedef CCPtr<CCProgressTimer>  CCActionProgressTimerPtr; 
typedef CCPtr<CCGrid3D>  CCActionGrid3DPtr; 
typedef CCPtr<CCActionInstant>  CCActionInstantPtr; 
typedef CCPtr<CCActionTween>  CCActionTweenPtr; 
typedef CCPtr<CCAffineTransform>  CCAffineTransformPtr; 
typedef CCPtr<CCDictionary>  CCDictionaryPtr; 
typedef CCPtr<CCObject>  CCObjectPtr; 
typedef CCPtr<CCArray>  CCArrayPtr; 
typedef CCPtr<CCSet>  CCSetPtr; 
typedef CCPtr<CCAutoreleasePool>  CCAutoreleasePoolPtr; 
typedef CCPtr<CCInteger>  CCIntegerPtr; 
typedef CCPtr<CCFloat>  CCFloatPtr; 
typedef CCPtr<CCDouble>  CCDoublePtr; 
typedef CCPtr<CCBool>  CCBoolPtr; 
typedef CCPtr<CCString>  CCStringPtr; 
typedef CCPtr<CCZone>  CCZonePtr; 
typedef CCPtr<CCAnimation> CCAnimationPtr; 
typedef CCPtr<CCNode> CCNodePtr; 
// add other typedef  
// ...  
NS_CC_END 
 
#endif // _CCPTR_H_ 

#ifndef _CCPTR_H_
#define _CCPTR_H_
NS_CC_BEGIN

template<class _Ty>
class CCPtr

public:
 typedef CCPtr<_Ty> _Myt;

 explicit CCPtr(_Ty *_Ptr = 0)
  : _Myptr(_Ptr)
 { 
  CC_SAFE_RETAIN(_Myptr);
 }

 explicit CCPtr(_Myt const & _Ref)
  : _Myptr(_Ref.get())
 {
  CC_SAFE_RETAIN(_Myptr);
 }

 _Myt&

补充:移动开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,