大家之所以觉得cocos2d-x容易上手入门,估计就是因为AutoreleasePool(个人以为)
PoolManager 管理 AutoreleasePool
class CC_DLL PoolManager { AutoreleasePool *getCurrentPool() const; std::vector<AutoreleasePool*> _releasePoolStack; };
class CC_DLL AutoreleasePool { void addObject(Ref *object); void clear(); bool contains(Ref* object) const; void dump(); }
AutoreleasePool 的实现会让大牛觉得不屑;
void DisplayLinkDirector::mainLoop() { ... PoolManager::getInstance()->getCurrentPool()->clear(); }
直接看clear
void AutoreleasePool::clear() { for (const auto &obj : _managedObjectArray) { obj->release(); } _managedObjectArray.clear(); // 留意这里,这里清空了 }
可以看到,遍历并release并清空
所以一开始 _managedObjectArray.reserve(150); 已经足够。
关注 _managedObjectArray
void AutoreleasePool::addObject(Ref* object) { _managedObjectArray.push_back(object); }
见CCObject(3.0换成了Ref)
Ref* Ref::autorelease() { PoolManager::getInstance()->getCurrentPool()->addObject(this); return this; }
这就是 autorelease 的意义
以Speed动作对象为例
Speed* Speed::create(ActionInterval* action, float speed) { Speed *ret = new (std::nothrow) Speed(); if (ret && ret->initWithAction(action, speed)) { ret->autorelease(); return ret; } CC_SAFE_DELETE(ret); return nullptr; }
实际上,AutoreleasePool autorelease 等和 引用计数没有什么关系。引用技术是release 和 retain 的技术。
时间: 2024-10-09 17:04:17