2013-12-18 30 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

對不起,這是一個錯字。我會更新我的問題。 –