# UNDF: UNDF-2026-000000960 --- a/cocos/base/CCEventDispatcher.h +++ b/cocos/base/CCEventDispatcher.h @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -335,7 +336,7 @@ std::vector _toAddedListeners; /** The listeners to be removed after dispatching event */ - std::vector _toRemovedListeners; + std::unordered_set _toRemovedListeners; /** The nodes were associated with scene graph based priority listeners */ std::set _dirtyNodes; --- a/cocos/base/CCEventDispatcher.cpp +++ b/cocos/base/CCEventDispatcher.cpp @@ -607,8 +607,7 @@ void EventDispatcher::removeEventListener(EventListener* listener) return; // just return if listener is in _toRemovedListeners to avoid remove listeners more than once - if (std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), listener) != _toRemovedListeners.end()) + if (_toRemovedListeners.count(listener) > 0) return; bool isFound = false; @@ -636,7 +635,7 @@ void EventDispatcher::removeEventListener(EventListener* listener) } else { - _toRemovedListeners.push_back(l); + _toRemovedListeners.insert(l); } isFound = true; @@ -1171,9 +1170,8 @@ void EventDispatcher::updateListeners(Event* event) { iter = sceneGraphPriorityListeners->erase(iter); // if item in toRemove list, remove it from the list - auto matchIter = std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), l); - if (matchIter != _toRemovedListeners.end()) - _toRemovedListeners.erase(matchIter); + if (_toRemovedListeners.count(l) > 0) + _toRemovedListeners.erase(l); releaseListener(l); } else @@ -1192,9 +1190,8 @@ void EventDispatcher::updateListeners(Event* event) { iter = fixedPriorityListeners->erase(iter); // if item in toRemove list, remove it from the list - auto matchIter = std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), l); - if (matchIter != _toRemovedListeners.end()) - _toRemovedListeners.erase(matchIter); + if (_toRemovedListeners.count(l) > 0) + _toRemovedListeners.erase(l); releaseListener(l); } else @@ -1560,7 +1557,7 @@ void EventDispatcher::cleanToRemovedListeners() { for (auto& l : _toRemovedListeners) { - auto listenersIter = _listenerMap.find(l->getListenerID()); + auto listenersIter = _listenerMap.find(l->getListenerID()); if (listenersIter == _listenerMap.end()) { releaseListener(l);