cocos2D-x 3.5 引擎解析之–引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)

cocos2D-x 3.5 引擎解析之–引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)

大家好,又见面了,我是全栈君。

#include <CCRef.h>

Ref is used for reference count manangement. If a classinherits from Ref.

Class Ref 为引用计数类,用来管理对象的引用计数。

这样就不会出现还有指针保持指向该对象,当使用该指针操作时,假设指向的对象被销毁就会出现程序异常。

class CC_DLL Ref

{

public:

 

    void retain();//添加引用计数一次

 

void release();//降低引用计数一次,假设此时引用计数为零,使用AutoreleasePoolManager释放内存

 

    Ref* autorelease();//把当前对象增加到自己主动释放池中。使之成为一个可使用引用计数的对象

比如:

    PhysicsBody* PhysicsBody::create()

{

    PhysicsBody* body = new (std::nothrow) PhysicsBody();

    if (body && body->init())

    {

        body->autorelease();//此处使用autorelease把body增加到自己主动释放池,就能够使body成为一个能够被引用计数的对象

        return body;

    }

    CC_SAFE_DELETE(body);

    return nullptr;

}

    unsigned int getReferenceCount() const;//返回引用计数值

 

protected:

   

    Ref();//初始化引用计数为1

 

public:

   

    virtual ~Ref();

 

protected:

     

    unsigned int _referenceCount;//引用计数

 

    friend class AutoreleasePool//自己主动释放池友元类

 

};

PoolManager为资源池管理器。管理着一个自己主动释放池的vector。採用的是单例模式设计的。也就是说仅仅同意一个PoolManager对象。

#include <CCAutoreleasePool.h>

class CC_DLL PoolManager

{

public:

 

    CC_DEPRECATED_ATTRIBUTE static PoolManager* sharedPoolManager() { return getInstance(); }//static 方法返回单例对象的指针

    static PoolManager* getInstance();//使用该函数返回一个单例对象的指针,此处会检查s_singleInstance是否为空,为空就new一个PoolManager对象

   

    CC_DEPRECATED_ATTRIBUTE static void purgePoolManager() { destroyInstance(); }//析构PoolManager指针

    static void destroyInstance();

   

    

    AutoreleasePool *getCurrentPool() const;//返回vector中最后一个自己主动释放池对象

 

    bool isObjectInPools(Ref* obj) const;//检查自己主动释放池中是否有obj对象

 

 

    friend class AutoreleasePool;//设置自己主动释放池为友元类

   

private:

    PoolManager();//构造函数。初始化vector能够包括十个自己主动释放池

    ~PoolManager();

   

    void push(AutoreleasePool *pool);//把pool从back增加到vector

    void pop();//弹出vector中back元素

   

    static PoolManager* s_singleInstance;//单例对象指针,设置为私有元素

   

    std::vector<AutoreleasePool*> _releasePoolStack;//该类管理的自己主动释放池vector

};

 

自己主动释放池管理着一个引用计数对象的vector,而且每一个自己主动释放池有自己的名字

#include <CCAutoreleasePool.h>

class CC_DLL AutoreleasePool

{

public:

   

    AutoreleasePool();//构造函数,初始化自己主动释放池名字为空,vector容量为150

  

    AutoreleasePool(const std::string &name); //构造函数,初始化自己主动释放池名字为name,vector容量为150

     

    ~AutoreleasePool();//析构函数

 

    void addObject(Ref *object);//把object对象从back增加到vector中

 

    void clear();//清空vector

   

    bool contains(Ref* object) const;//检查vector中是否含有object对象

    void dump();

   

private:

    std::vector<Ref*> _managedObjectArray;//vector对象

    std::string _name;//自己主动释放池的名字

   

};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116596.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 小米6显示服务器出错,小米6解锁BL显示未连接手机解决办法以及各种小技巧汇总……

    小米6显示服务器出错,小米6解锁BL显示未连接手机解决办法以及各种小技巧汇总……本帖最后由为夫人而生于2017-6-2422:56编辑持续更新小米6未连接手机解决办法3:手机设置→关于手机→miui版本(一直点五次)→返回→更多设置→开发者选项→USB调试打开→手机绑定啥的解锁啥的都打开4:关机长按音量下加开机键出现兔子连接手机5:两种情况若显示连接直接解锁end;;;;;;;;;若显示没连接手机敲黑板重点来了右…

  • 软件介绍网站:“软矿”x-berry「建议收藏」

    软件介绍网站:“软矿”x-berry「建议收藏」今天发现了一个推荐软件的网站叫做“软矿”做的很不错。页面简洁,大方,内容也很新。我查询的是虚拟机相关的软件和技术,里面对VMware和Virtualbox的介绍都比较丰富。

  • 面向过程,面向对象,面向接口,面向切面的区别

    面向过程,面向对象,面向接口,面向切面的区别

  • vue前端面试题2022_前端常见面试题

    vue前端面试题2022_前端常见面试题然后现在也是找了一些在Vue方面经常出现的面试题,留给自己查看消化,也分享给有需要的小伙伴。如果文章中有出现纰漏、错误之处,还请看到的小伙伴留言指正,先行谢过。以下↓1.说一下Vue的双向绑定数据的原理vue实现数据双向绑定主要是:采用数据劫持结合“发布者-订阅者”模式的方式,通过Object.defineProperty()来劫持各个属性的setter、…

  • 编程小白的博客日记[通俗易懂]

    编程小白的博客日记[通俗易懂]编程小白的博客日记2018-11-9星期五晴最近放假,一天下来好像什么都没干,不过今天去看了《毒液》,还是非常好看的,最皮我毒液!今天在网上看到一篇文章,是关于在python中使用you-get来下载网上的视频和音乐之类的,先打开cmd安装you-get,之后再打开一个cmd,输入you-get-o地址,然后就能下载视频了,不过如果这个视频在原…

  • vs 内存泄露 检测(android怎么检测内存泄露)

    BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误。              BoundsChecker能检测的错误包括:      1)指针操作和内存、资源泄露错误,比如:内存泄露;资源泄露;对指针变量的错误操作。    2)内存操作方面的错误,比如:内存读、写溢出;使用未初始化的内存。         3)API函

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号