2013-12-18 27 views
0

首先,作为一个免责声明,我是新来的objective-c,xcode和cocos2d。我在我的应用程序中找到了方便刷新屏幕的方法,但我不知道这是否是不好的做法。这是我正在做的。我有一个叫做Player的类,它有一个变量NSString * name。我在函数中使用此代码在屏幕上显示这个和其他几个变量:CCLabelTTF改变字符串导致EXC_BAD_ACCESS

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

当按下一个按钮,我与其他几个变量一起修改播放器 - >名字。由于几个变量正在改变(在这个屏幕上,最终是其他人),当按下按钮时,我还设置了一个标志来指示屏幕需要刷新。然后我和调度检查这个代码:

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-> name的值时,我得到这个:“线程1:EXC_BAD_ACCESS(code = 1,地址= ...)“?如果我逐步使用调试器,则该值将正确分配给player-> name并且屏幕刷新工作。但是,如果我让它运行,当我尝试访问player-> name并且数据看起来被破坏时(例如(NSString *)name = 0x15927f80(当我期待(NSString *)name = @“Bob”)时,它会得到EXC_BAD_ACCESS。

一些额外的细节。

  • 我没有设置refreshScreen为“true”,直到更改播放器 - 的价值>名称
  • 为了防止清爽,前值才真正改变了之后,我设置刷新延迟。按下按钮后,我会修改player-> name并等待大约10秒,但我仍然会看到同样的问题。

任何想法?谢谢。

+0

我想出了问题所在。这是一个内存管理问题。我使用此处指定的示例为变量添加了getter和setter:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW1 –

回答

0

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

0

试试这个:

[self addChild:label]; 
+0

对不起,这是一个错字。我会更新我的问题。 –