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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是互质_数组转集合list

    什么是互质_数组转集合list给定 n 个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?输入格式第一行是一个正整数 n。第二行是 n 个不大于10000的正整数。输出格式一个正整数,即最少需要的组数。数据范围1≤n≤10输入样例:614 20 33 117 143 175输出样例:3#include<bits/stdc++.h>using namespace std;const int N = 1e2 + 10;int a[N],g[N][N];int n;int

    2022年8月9日
    7
  • 面试java工程师的自我介绍_软件开发和程序员一样吗

    面试java工程师的自我介绍_软件开发和程序员一样吗程序员面试时一段短短的自我介绍,其实是为了揭开更深入的面谈而设计的。下面学习啦小编为你带来java程序员面试自我介绍范文的内容,希望你们喜欢。关于java程序员面试自我介绍范文篇一本人叫小冰,今年22岁,现在是吉林大学软件开发与信息管理专业方向的三年级学生,对软件开发怀有浓烈的兴趣,且对JAVA语言尤其熟悉,能熟练使用jsp、struts、struts2、sring2和hibernate3等流行的…

    2025年6月28日
    6
  • 线上线下整合营销方案_线下推广活动案例

    线上线下整合营销方案_线下推广活动案例线上系统问题的紧急处理案例(一)

    2022年4月22日
    95
  • fcn全卷积神经网络搭建_区域卷积神经网络

    fcn全卷积神经网络搭建_区域卷积神经网络文章目录简介核心思想网络结构上采样Upsampling跳级结构CNN与FCN的区别与联系网络训练过程存在问题【参考】简介全卷积网络(FullyConvolutionalNetworks,FCN)是JonathanLong等人于2015年在FullyConvolutionalNetworksforSemanticSegmentation一文中提出的用于图像语义分割的一种框架,是深度学习用于语义分割领域的开山之作。FCN将传统CNN后面的全连接层换成了卷积层,这样网络的输出将是热力图而非类

    2022年9月25日
    1
  • android开机动画多长时间_Android开机动画原理分析

    android开机动画多长时间_Android开机动画原理分析Android系统开机动画,是由bootanimation进程将多桢的图片按次序循环播放,在屏幕上形成的动画效果。这里介绍一下bootanimation的原理。1.bootanimation启动bootanimation是一个本地进程,代码由c++编写,它由init进程启动/init.rcservicebootanim/system/bin/bootanimationclasscore…

    2022年5月14日
    54
  • threadlocal底层实现_hashset底层实现原理

    threadlocal底层实现_hashset底层实现原理ThreadLocal作用:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂性。package com.mupack;public class App{ private String content; public void setContent(String content) { this.content = content; } public Stri

    2022年8月8日
    4

发表回复

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

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