diff --git a/Easy2D/Base/App.cpp b/Easy2D/Base/App.cpp index fe9324a7..1147e6fd 100644 --- a/Easy2D/Base/App.cpp +++ b/Easy2D/Base/App.cpp @@ -383,6 +383,11 @@ void App::free() } // 删除所有定时器 Timer::clearAllTimers(); + MouseMsg::clearAllListeners(); + KeyMsg::clearAllListeners(); + ActionManager::clearAllActions(); + // 删除所有对象 + FreePool::__clearAllObjects(); } void App::destory() diff --git a/Easy2D/Base/FreePool.cpp b/Easy2D/Base/FreePool.cpp index c992d1e2..57c901a7 100644 --- a/Easy2D/Base/FreePool.cpp +++ b/Easy2D/Base/FreePool.cpp @@ -9,14 +9,14 @@ /// 让其自动释放 // 释放池容器 -static std::vector pool; +static std::vector s_vPool; void FreePool::__flush() { // 创建迭代器 std::vector::iterator iter; // 循环遍历容器中的所有对象 - for (iter = pool.begin(); iter != pool.end();) + for (iter = s_vPool.begin(); iter != s_vPool.end();) { // 若对象的引用的计数为 0 if ((*iter)->m_nRefCount == 0) @@ -24,7 +24,7 @@ void FreePool::__flush() // 释放该对象 delete (*iter); // 从释放池中删除该对象 - iter = pool.erase(iter); + iter = s_vPool.erase(iter); } else { @@ -35,12 +35,14 @@ void FreePool::__flush() void FreePool::__add(Object * nptr) { -#ifdef _DEBUG - for (auto o : pool) - { - assert(o != nptr); // 不得有重复的指针存在 - } -#endif - - pool.push_back(nptr); // 将一个对象放入释放池中 + s_vPool.push_back(nptr); // 将一个对象放入释放池中 +} + +void FreePool::__clearAllObjects() +{ + for (auto o : s_vPool) + { + delete o; + } + s_vPool.clear(); } diff --git a/Easy2D/Object/Object.cpp b/Easy2D/Object/Object.cpp index 5392f881..66411ea6 100644 --- a/Easy2D/Object/Object.cpp +++ b/Easy2D/Object/Object.cpp @@ -1,7 +1,8 @@ #include "..\easy2d.h" Object::Object() : - m_nRefCount(0) + m_nRefCount(0), + m_bAutoRelease(false) { } @@ -21,5 +22,9 @@ void Object::release() void Object::autoRelease() { - FreePool::__add(this); // 将该对象放入释放池中 + if (!m_bAutoRelease) + { + m_bAutoRelease = true; + FreePool::__add(this); // 将该对象放入释放池中 + } } diff --git a/Easy2D/Tool/ActionManager.cpp b/Easy2D/Tool/ActionManager.cpp index 344f0160..69b8f9c9 100644 --- a/Easy2D/Tool/ActionManager.cpp +++ b/Easy2D/Tool/ActionManager.cpp @@ -144,3 +144,13 @@ void ActionManager::stopAllActions() action->stop(); } } + +void ActionManager::clearAllActions() +{ + for (auto action : s_vActions) + { + action->autoRelease(); + action->release(); + } + s_vActions.clear(); +} diff --git a/Easy2D/easy2d.h b/Easy2D/easy2d.h index b0d25bb9..d48e7309 100644 --- a/Easy2D/easy2d.h +++ b/Easy2D/easy2d.h @@ -206,6 +206,8 @@ private: static void __flush(); // 将一个节点放入释放池 static void __add(Object * nptr); + // 删除所有节点 + static void __clearAllObjects(); }; class Scene @@ -251,6 +253,7 @@ public: protected: int m_nRefCount; + bool m_bAutoRelease; }; class MouseMsg @@ -1472,6 +1475,8 @@ public: static void pauseAllActions(); // 停止当前存在的所有动作 static void stopAllActions(); + // 删除当前存在的所有动作 + static void clearAllActions(); private: static void __exec();