CCLabelTTF更改字符串会导致EXC_BAD_ACCESS

时间:2013-12-18 23:52:32

标签: ios objective-c cocos2d-iphone

首先,作为免责声明,我是objective-c,xcode和cocos2d的新手。我在我的应用程序中找到了一种方便刷新屏幕的方法,但我不知道这是不好的做法。这就是我在做什么。我有一个名为Player的类,其中包含一个变量NSString * name。我在一个函数中使用此代码在屏幕上显示此变量和其他几个变量:

label = [CCLabelTTF labelWithString:string fontName:GLOBAL_FONT fontSize:font_size ];
label.color = color_back;
label.position = ccp(x+1, y-1);
[self addChild:label];

按下按钮时,我正在修改player-> name以及其他几个变量。因为当按下按钮时,几个变量正在改变(在这个屏幕上,最后是其他变量),我还设置了一个标志,指示需要刷新屏幕。然后我用调度程序检查这段代码:

if(panelPrev != currentPanel || refreshScreen)    //do we need to initialize the panel?
{
    [self removeAllChildrenWithCleanup:true];     //clear all objects from display

    //Decide which objects to display
    switch (G_display_panel) {
        case P_Main:
            [Display_Main init_Panel:self];
            break;
        case P_NewGame:
            [Display_New init_Panel:self];
            break;

        default:
            break;
    }
    refreshScreen = false;
}

我的第一个问题:这是一种可以接受的方式来向屏幕显示内容并刷新它们吗?它似乎比更新正在显示的每个变量更方便。按钮没有经常按下,所以我不关心性能。

第二:如果可以这样做,为什么当我按下按钮并更改player->名称的值时,我得到这个:“线程1:EXC_BAD_ACCESS(代码= 1,地址) = ...)“?如果我单步执行调试器,则值将正确分配给player->名称,并且屏幕刷新将起作用。但是,如果我让它运行,当我尝试访问player->名称并且数据看起来已损坏时会获得EXC_BAD_ACCESS(例如(NSString *)name = 0x15927f80,当我期待(NSString *)name = @“Bob”)

其他一些细节。

  • 在更改player-> name
  • 的值之前,我没有将refreshScreen设置为'true'
  • 要在值真正更改之前阻止刷新,我会在刷新时设置延迟。按下按钮后,我会修改播放器 - >名称并等待大约10秒,但我仍然会看到同样的问题。

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:0)

试试这个:

[self addChild:label];

答案 1 :(得分:0)

我弄明白了这个问题。这是一个内存管理问题。我使用此处指定的示例为变量添加了一个getter和setter:developer.apple.com/library/mac/documentation/Cocoa/Conceptual / ... -