zoukankan      html  css  js  c++  java
  • 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;//自己主动释放池的名字

       

    };

  • 相关阅读:
    iOS微信支付
    iOS登录及token的业务逻辑(没怎么用过,看各种文章总结)
    IOS 支付宝支付开发流程
    iOS SDWebImage实现原理
    站立会议1
    作业六:团队项目——编写项目的Spec
    作业5
    站立会议8
    站立会议 3
    站立会议 2
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5064770.html
Copyright © 2011-2022 走看看