关于3.0中MenuItem点击不崩溃,而cocoStudio的Button点击崩溃的问题

目标功能:点击按钮后移除掉按钮所在的Layer。

一、
MenuItem

1)创建MenuItem代码

    MenuItemImage* closeItem = MenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png"
                                        
    );
    
    closeItem->setCallback( (Ref* pSender)
                            {
                                this->removeFromParent(); //this是个Layer,当调用完这句话时其实closeItem并没有被释放
                                closeItem->setNormalImage(Sprite::create("CloseSelected.png"));
                            });

2)不崩溃原因:见如下代码,Menu在调用callback函数时把自己retain,结束时把自己在release,也就说在调用callback时Layer被释放了,但Menu没被释放,Menu里的MenuItemImage也没有被释放,所以调用closeItem->setNormalImage就不会崩。

void Menu::onTouchEnded(Touch* touch, Event* event)
{
    CCASSERT(_state == Menu::State::TRACKING_TOUCH, " -- invalid state");
    this->retain();
    if (_selectedItem)
    {
        _selectedItem->unselected();
        _selectedItem->activate();
    }
    _state = Menu::State::WAITING;
    this->release();
}

二、ui::Button

  1. 创建
    ui::Button
Button* pBtn = Button::create("CloseNormal.png","CloseSelected.png"); 
addChild(pBtn); 
pBtn->addTouchEventListener((Ref* target,Widget::TouchEventType type)
 {
     if (Widget::TouchEventType::ENDED==type)
     {
              this->removeFromParent(); 
              pBtn->loadTextureNormal("CloseNormal.png");// 这就崩溃了,因为this(Layer)释放时 
     }
 });

2)崩溃的原因:调用callback前没有retain自己

void Widget::releaseUpEvent()
{ 
    if (_touchEventCallback) 
{  
      _touchEventCallback(this, TouchEventType::ENDED);    
}     
if (_touchEventListener && _touchEventSelector)    
{   
     (_touchEventListener->*_touchEventSelector)(this,TOUCH_EVENT_ENDED);    
}
}

请问各位有没有什么好的解决方案吗,难道要我们改代码也手动retain和release吗

没人回答吗?呼叫版主啊

@偶尔e网事