首先,作为一个免责声明,我是新来的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秒,但我仍然会看到同样的问题。
任何想法?谢谢。
我想出了问题所在。这是一个内存管理问题。我使用此处指定的示例为变量添加了getter和setter:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW1 –