cocos2d-x版本是cocos2d-x-3.3rc0
有一个类,首先新建了一个EventListenerCustom
this->_physicsEventListener = EventListenerCustom::create(PhysicsEvent::EVENT_NAME, std::bind(&PhysicsEventObserver::onPhysicsEvent, this ,std::placeholders::_1)); this->_physicsEventListener->retain(); ``` 之后添加到EventDispatcherDirector::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(this->_physicsEventListener, 1); ``` 当类析构的时候,删除EventLisenterDirector::getInstance()->getEventDispatcher()->removeEventListener(this->_physicsEventListener); CC_SAFE_RELEASE_NULL(this->_physicsEventListener); ``` 代码没有什么问题,但是这个_physicsEventListener却不会被正确释放,我仔细跟踪了一下,发现在CCEventDispatcher.cpp文件中for (auto iter = listeners->begin(); iter != listeners->end(); ++iter) { auto l = *iter; if (l == listener) { CC_SAFE_RETAIN(l); l->setRegistered(false); if (l->getAssociatedNode() != nullptr) { dissociateNodeAndEventListener(l->getAssociatedNode(), l); l->setAssociatedNode(nullptr); // nullptr out the node pointer so we don't have any dangling pointers to destroyed nodes. } if (_inDispatch == 0) { listeners->erase(iter); CC_SAFE_RELEASE(l); } isFound = true; break; } } ``` 下面这个判断由于_inDispatch != 0,导致上面CC_SAFE_RETAIN(l);这次不会被release。关于_inDispatch的具体细节不太清除,想知道这个问题是由什么导致的?if (_inDispatch == 0) { listeners->erase(iter); CC_SAFE_RELEASE(l); } ```