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

       

    };

  • 相关阅读:
    mac os programming
    Rejecting Good Engineers?
    Do Undergrads in MIT Struggle to Obtain Good Grades?
    Go to industry?
    LaTex Tricks
    Convert jupyter notebooks to python files
    How to get gradients with respect to the inputs in pytorch
    Uninstall cuda 9.1 and install cuda 8.0
    How to edit codes on the server which runs jupyter notebook using your pc's bwroser
    Leetcode No.94 Binary Tree Inorder Traversal二叉树中序遍历(c++实现)
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5064770.html
Copyright © 2011-2022 走看看