Open zhishu520 opened 5 years ago
Ref
// 创建时候为1 Ref::Ref() : _referenceCount(1) { } // 被 addChild 的时候会调用retain, 引用计数 +1 void Ref::retain() { ++_referenceCount; } // 被 remove 的时候会调用release, 引用计数 -1 // 引用计数为0 的时候释放对象 void Ref::release() { --_referenceCount; if (_referenceCount == 0) { delete this; } }
OK, 原理就是这样了,引用计数为0的时候就会释放,但是还有两个疑问:
别急,请往下看!
// 创建时调用,加入缓存池 Ref* Ref::autorelease() { PoolManager::getInstance()->getCurrentPool()->addObject(this); return this; } // 主循环,下一帧时释放 void Director::mainLoop() { // XXXX { drawScene(); // release the objects PoolManager::getInstance()->getCurrentPool()->clear(); } } // swap 圈起来,重点, vector clear是无法释放掉已经分配的内存的,swap可以。 void AutoreleasePool::clear() { std::vector<Ref*> releasings; releasings.swap(_managedObjectArray); for (const auto &obj : releasings) { obj->release(); } }
这样的话下一帧的时候就会自动把引用计数为1的都给释放掉了。
引用计数类
Ref
OK, 原理就是这样了,引用计数为0的时候就会释放,但是还有两个疑问:
别急,请往下看!
对象缓存池
这样的话下一帧的时候就会自动把引用计数为1的都给释放掉了。