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;//自己主动释放池的名字

   

};

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 方程推导:二阶有源带通滤波器设计!(下载:教程+原理图+视频+代码)

    方程推导:二阶有源带通滤波器设计!(下载:教程+原理图+视频+代码)1、背景对于微弱的信号的处理方式一般是:放大和滤波,这个过程中就涉及到放大电路的选取、滤波器的选择以及偏置电路的设计。本例以实例的方式讲解并附带参数计算、仿真、实物测试三个环节。假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频…

    2022年6月7日
    37
  • SPI协议代码

    SPI协议代码软件模拟SPI程序代码概述:   通过两个MCU(STM32F103)来模拟SPI的主从机,完成主机发送从机接收,便于理解SPI协议。SPI协议简介●SPI接口介绍  SCK:时钟信号,由主设备产生,所以主设备SCK信号为输出模式,从设备的SCK信号为输入模式。  CS:使能信号,由主设备控制从设备,,所以主设备CS信号为输出模式,从设备的CS信号为输入模式。  MOSI:主设备数据输出,从设备数据输入,所以主设备MOSI信号为输出模式,从设备的MOSI信号为输入模式。  MISO:主设备数

    2022年10月16日
    1
  • Python – 0b、0o、0x

    Python – 0b、0o、0xa=0b010b=0o010c=0x010print(type(a),a)print(type(b),b)print(type(c),c)#————-print(0b010&0b111)print(0b001|0b010)print(0b010^0b100)print(~0b001)#原码->补码->求原码(原码的值+符…

    2022年6月24日
    29
  • IDEA git配置[通俗易懂]

    1、idea配置git(versioncontrol)1.2、拉取代码idea菜单上选择VCS输入git代码地址,注意是http协议的地址不要用git协议的地址,目前用git协议的地址老是报错,因为git协议的址找不到配置sshprivatekey的地方,后面找到方法再更一版。点确定,代码就可以拉下来了。1.3、拉取代码提交代码快捷键ct…

    2022年4月14日
    66
  • acwing321. 棋盘分割(动态规划+记忆化搜索)「建议收藏」

    acwing321. 棋盘分割(动态规划+记忆化搜索)「建议收藏」将一个 8×8 的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了 (n−1) 次后,连同最后剩下的矩形棋盘共有 n 块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成 n 块矩形棋盘,并使各矩形棋盘总分的均方差最小。均方差formula.png ,其中平均值lala.png ,xi 为第 i 块矩形棋盘的总分。请编程对给出的棋盘及 n,求出均方差的最

    2022年8月8日
    3
  • CSS美化超链接样式

    CSS美化超链接样式美化超链接样式一、使用动态伪类注意!!!超链接的四种状态样式的排列是固定的,一般不能随意调换正确的顺序时Link,visited,hover,active当鼠标经过超链接是,会先执行第一行声明,但是紧接着第三行声明会覆盖掉第一行和第二行声明的样式,所以无法看到鼠标经过和被激活时的效果<styletype=”text/css”>a:link{color:red;}…

    2022年7月19日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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