axmol/samples/TestCpp/Classes/BugsTest/Bug-422.cpp

65 lines
1.6 KiB
C++

//
// Bug-422 test case by lhunath
// http://code.google.com/p/cocos2d-iphone/issues/detail?id=422
//
#include "Bug-422.h"
bool Bug422Layer::init()
{
if (BugsTestBaseLayer::init())
{
reset();
return true;
}
return false;
}
void Bug422Layer::reset()
{
static int localtag = 0;
localtag++;
// TO TRIGGER THE BUG:
// remove the itself from parent from an action
// The menu will be removed, but the instance will be alive
// and then a new node will be allocated occupying the memory.
// => CRASH BOOM BANG
CCNode *node = getChildByTag(localtag-1);
CCLog("Menu: %p", node);
removeChild(node, false);
// [self removeChildByTag:localtag-1 cleanup:NO];
CCMenuItem *item1 = CCMenuItemFont::create("One", this, menu_selector(Bug422Layer::menuCallback));
CCLog("MenuItemFont: %p", item1);
CCMenuItem *item2 = CCMenuItemFont::create("Two", this, menu_selector(Bug422Layer::menuCallback));
CCMenu *menu = CCMenu::create(item1, item2, NULL);
menu->alignItemsVertically();
float x = CCRANDOM_0_1() * 50;
float y = CCRANDOM_0_1() * 50;
menu->setPosition(ccpAdd( menu->getPosition(), ccp(x,y)));
addChild(menu, 0, localtag);
//[self check:self];
}
void Bug422Layer::check(CCNode* t)
{
CCArray *array = t->getChildren();
CCObject* pChild = NULL;
CCARRAY_FOREACH(array, pChild)
{
CC_BREAK_IF(! pChild);
CCNode* pNode = (CCNode*) pChild;
CCLog("%p, rc: %d", pNode, pNode->retainCount());
check(pNode);
}
}
void Bug422Layer::menuCallback(CCObject* sender)
{
reset();
}