EXC_BAD_ACCESS - objc - 单击以评估应用程序崩溃

时间:2016-05-08 04:43:51

标签: c++ ios

我正在尝试使用错误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语句中抛出错误。

提前感谢您提供的任何帮助。

0 个答案:

没有答案