EventListener内存泄露?

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();

```


之后添加到EventDispatcher
Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(this->_physicsEventListener, 1);

```


当类析构的时候,删除EventLisenter
Director::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);
                }

```

仔细看了一下, 当在事件派发循环中,某个事件响应函数里进行删除Listener操作,就会引起这个问题, 解决方法就是不要再任何事件响应函数里删除Listener

为何你要自己this->_physicsEventListener->retain();一下. 这种创建出来的东西. 如果是要加到其它地方. cocos2d 不是不需要手动retain么