-
- class CC_DLL AutoreleasePool
- {
- public:
- //创建一个存放ref的对象池,并且放入PoolManager对象池管理器中
- AutoreleasePool();
- //创建一个存放ref的对象池,并且放入PoolManager对象池管理器中,并取个名字
- AutoreleasePool(const std::string &name);
- ~AutoreleasePool();
- //添加一个ref对象到对象池中
- void addObject(Ref *object);
- //循环遍历容器并让容器中的ref对象调用release,最后清理容器,设置_isClearing 为true
- //(调用release函数的作用是计数减1,如果计数为0,删除对象。
- //比如我们创建一个精灵时计数为1并加到对象池中,添加到场景中时计数加1变为2,
- //该帧结束前,遍历对象池中的对象,调用release函数,使每个刚创建的精灵计数减1 ,
- //并且判断如果为0时删除该精灵,然后清空该对象池了来准备存放以后创建的对象,周而复始)
- void clear();
- #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
- //判断是否为空
- bool isClearing() const { return _isClearing; };
- #endif
- //判断容器中是否有该ref对象
- bool contains(Ref* object) const;
- //调试用的东东
- void dump();
- private:
- //存放对象的容器,别忘了他每帧结束前遍历元素使之调用release,最后容器被清空了
- std::vector<Ref*> _managedObjectArray;
- //池的名字,好像没什么用。。。
- std::string _name;
- #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
- bool _isClearing;
- #endif
- };
- class CC_DLL PoolManager
- {
- public:
- CC_DEPRECATED_ATTRIBUTE static PoolManager* sharedPoolManager() { return getInstance(); }
- //如果为NULL,创建一个对象池管理器,并且创建一个对象池
- static PoolManager* getInstance();
- CC_DEPRECATED_ATTRIBUTE static void purgePoolManager() { destroyInstance(); }
- static void destroyInstance();
- //得到当前的AutoreleasePool对象池,别忘了AutoreleasePool中存放着ref对象
- AutoreleasePool *getCurrentPool() const;
- //对象池管理器中是否存在该对象
- bool isObjectInPools(Ref* obj) const;
- //友元函数可以调用AutoreleasePool的私有成员或函数(没记错的话。。)
- friend class AutoreleasePool;
- private:
- PoolManager();
- ~PoolManager();
- //加入和删除对象池
- void push(AutoreleasePool *pool);
- void pop();
- //对象池管理器单例
- static PoolManager* s_singleInstance;
- //存放对象池的容器
- std::deque<AutoreleasePool*> _releasePoolStack;
- //当前的对象池
- AutoreleasePool *_curReleasePool;
- };
- 不知道是不是我考虑千周到,我好像发现一个bug在CCAutoreleasePool.cpp中
- PoolManager* PoolManager::getInstance()
- {
- if (s_singleInstance == nullptr)
- {
- s_singleInstance = new PoolManager();
- // Add the first auto release pool
- s_singleInstance->_curReleasePool = new AutoreleasePool("cocos2d autorelease pool");
- //s_singleInstance->_releasePoolStack.push_back(s_singleInstance->_curReleasePool);//添加了第2遍
- }
- return s_singleInstance;
- }
- PoolManager::~PoolManager()
- {
- CCLOGINFO("deallocing PoolManager: %p", this);
- while (!_releasePoolStack.empty())
- {
- AutoreleasePool* pool = _releasePoolStack.back();
- //_releasePoolStack.pop_back();删除了2次
- delete pool;
- }
- }
- 如果正常跑起来是没有错误的,但是如果我在自己代码中创建了一个AutoreleasePool* a = new AutoreleasePool("a");后就会报错,
- 怎么不能用自定义的对象呢,结果发现代码中的问题,我把2段代码注释了后就能在代码中任意添加AutoreleasePool对象。