我正在尝试使用错误EXC_BAD_ACCESS(code = 1,address = 0x0)调试崩溃。在显示带有两个按钮的视图后,会出现问题,现在或稍后对应用程序进行评级。如果单击“速率”或“稍后”按钮,则会在代码中的同一行发生崩溃。
我还在学习Swift,对C ++几乎一无所知,或者我认为我可以解决这个问题。但是,我知道这是一个内存问题。我一直无法找到任何僵尸,所以我一直在查看代码(我没写过)试图找到遗漏或空缺的东西。因为按下Later会导致崩溃,我认为在尝试关闭视图时会有一些缺失或扭曲。
Xcode中的错误消息指向if语句的开头:
$(pkg-config --libs vorbisenc)
menuItem在错误报告的变量列表中显示为NULL。
该类中唯一的menuItem实例位于错误上方的一行:
if (menuItem->getTag()) {
NativeBridge::rateApp();
UserDefault::getInstance()->setBoolForKey("rate", true);
UserDefault::getInstance()->flush();
}
此处所在的班级可在此处找到:https://github.com/mrbradshaw5/swimfree/blob/master/GameScene.cpp
非常感谢任何帮助!
由于这也是我在这里的第一篇文章,请告诉我我需要提供的其他信息。
更新
我认为错误来自这段代码,它没有所需的精灵。 menuItem的类型为MenuItemSprite,menuItem的两个实例都为NULL。
MenuItemImage *menuItem = dynamic_cast<MenuItemImage*>(pSender);
psender在这里创建
#pragma mark -- show rate view
void GameScene::showRateView()
{
if (UserDefault::getInstance()->getBoolForKey("rate")) return;
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
MenuItem *disableLayer = MenuItemSprite::create(LayerColor::create(Color4B(0, 0, 0, 0)), NULL, NULL);
Menu *menu = Menu::create(disableLayer, NULL);
menu->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
menu->setPosition(origin.x + visibleSize.width*0.5, origin.y + visibleSize.height*0.5);
menu->setTag(1111);
this->addChild(menu, 100);
LayerColor *m_pRateLayer = LayerColor::create(Color4B(0, 0, 0, 77), visibleSize.width, visibleSize.height);
m_pRateLayer->setTag(1112);
m_pRateLayer->retain();
Sprite *pBg = Sprite::create("bg_rate.png");
pBg->setPosition(origin.x + visibleSize.width*0.5, origin.y + visibleSize.height*0.5);
m_pRateLayer->addChild(pBg);
float bgW = pBg->getContentSize().width, bgH = pBg->getContentSize().height;
MenuItem *pRate = MyWidget::createMenuItemSpriteFrameName("button_rate.png", CC_CALLBACK_1(GameScene::onPressRateCallback, this));
pRate->setAnchorPoint(Vec2(0, 0.5));
pRate->setTag(1);
pRate->setPosition(Vec2(pBg->getPositionX() - 0.45 * bgW , pBg->getPositionY() - bgH / 2));
MenuItem *pLater = MyWidget::createMenuItemSpriteFrameName("button_later.png", CC_CALLBACK_1(GameScene::onPressRateCallback, this));
pLater->setTag(0);
pLater->setAnchorPoint(Vec2(1, 0.5));
pLater->setPosition(Vec2(pBg->getPositionX() + 0.45 * bgW, pBg->getPositionY() - bgH / 2));
Menu *pMenu = Menu::create(pRate, pLater, NULL);
pMenu->setAnchorPoint(Vec2::ZERO);
pMenu->setPosition(Vec2::ZERO);
m_pRateLayer->addChild(pMenu);
this->addChild(m_pRateLayer, 100);
}
导致创建menuItem的位置。
void GameScene::onPressRateCallback(cocos2d::Ref* pSender)
{
this->getChildByTag(1111)->removeFromParentAndCleanup(true);
this->getChildByTag(1112)->removeFromParentAndCleanup(true);
然后到抛出错误的行
MenuItemImage *menuItem = dynamic_cast<MenuItemImage*>(pSender);
在if语句中抛出错误。
提前感谢您提供的任何帮助。