2012-12-06 93 views
0

我總是使用ARC,但我的cocos2d模板不使用ARC,我必須使用手動引用計數,這可能是爲什麼我崩潰。
我們的目標是製作一個帶有兩個標籤的菜單,如果我點擊一個標籤,則會顯示帶有精靈的圖像。如果單擊圖像,我可以返回到菜單並再次選擇。
這是CCLayer類:Cocos2D應用程序與菜單和精靈崩潰與EXC_BAD_ACCESS

-(id) init 
{ 
    if((self=[super init])) 
    { 
     CCMenuItemLabel* item1, *item2; 
     CCLabelTTF* label1= [CCLabelTTF labelWithString: @"Shark Icon" fontName: @"Arial" fontSize: 30], *label2; 
     label2= [CCLabelTTF labelWithString: @"Cocos2D Icon" fontName: @"Arial" fontSize: 30]; 
     label1.color= ccRED; 
     label2.color= ccRED; 
     [label1 retain]; 
     [label2 retain]; 
     item1=[CCMenuItemLabel itemWithLabel: label1 block:^(id sender) 
     { 
      NSLog(@"Clicked shark icon"); 
      [self removeChild: menu cleanup: NO]; 
      shark=[CCSprite spriteWithFile: @"shark.jpeg"]; 
      [shark setPosition: CGPointMake(150, 200)]; 
      [self addChild: shark]; 
      [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate: self priority: 0 swallowsTouches: YES]; 
     }]; 
     item2= [CCMenuItemLabel itemWithLabel: label2 block:^(id sender) 
     { 
      NSLog(@"Clicked cocos2d icon"); 
      [self removeChild: menu cleanup: NO]; 
      icon=[CCSprite spriteWithFile: @"icon.png"]; 
      [icon setPosition: CGPointMake(150, 200)]; 
      [self addChild: icon]; 
      [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate: self priority: 0 swallowsTouches: YES]; 
     }]; 
     [item1 retain]; 
     [item2 retain]; 
     menu=[CCMenu menuWithItems: item1,item2, nil]; 
     [menu alignItemsVertically]; 
     [self addChild: menu]; 
    } 
    return self; 
} 

- (BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    [[CCTouchDispatcher sharedDispatcher] removeDelegate: self]; 
    [self removeChild: shark cleanup: NO]; 
    [self addChild: menu]; 
    return YES; 
} 

會發生什麼:我點擊「鯊魚圖標」(或「cocos2d的圖標」),然後鯊魚的形象出現,如果我點擊它,我得到EXC_BAD_ACCESS:

EXC_BAD_ACCESS (code=1, address= 0x70Baafc8) 

我試圖打印所有地址(菜單,物品1,等...),並沒有一個項目有這個address.Sometimes我甚至得到這樣0x00000008地址無效。

編輯

我會解決的只是保留菜單中的問題,但我不明白爲什麼:菜單已被保留:

@property (nonatomic, retain) CCSprite* shark; 
@property (nonatomic, retain) CCSprite* icon; 
@property (nonatomic, retain) CCMenu* menu; 

如果我讓殭屍我得到這個:

*** -[CCMenu tag]: message sent to deallocated instance 0x7c71a10 

所以菜單是一個殭屍,但不應該保留屬性使它被保留?
奇怪的是,我不需要保留鯊魚和圖標,只是菜單。

+0

在ccTouchBegan上設置了一個剎車點,這樣你就知道你的代碼在哪一行崩潰了 – Chakalaka

+0

當我將菜單添加爲子程序崩潰時,我會通過保留菜單來解決這個問題**,但是我不明白爲什麼**。屬性菜單是非原子的,保留,它應該已經保留。 –

+1

是的,但只有當你使用財產!你只使用指針。所以使self.menu = – Chakalaka

回答

1
menu = [CCMenu menuWithItems: item1,item2, nil]; 

菜單從未被保留。如果其保留財產使用self.menu

您創建一個新的鯊魚每次,但要重用您的菜單!

+0

任何家長都會保留它的孩子。所以菜單會因爲[self addChild:menu]而被保留;行 – Morion

+0

對不起,但他刪除菜單! – Chakalaka

+0

不明白你是什麼意思 – Morion

相關問題