目标功能:点击按钮后移除掉按钮所在的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
- 创建
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吗