我總是使用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
所以菜單是一個殭屍,但不應該保留屬性使它被保留?
奇怪的是,我不需要保留鯊魚和圖標,只是菜單。
在ccTouchBegan上設置了一個剎車點,這樣你就知道你的代碼在哪一行崩潰了 – Chakalaka
當我將菜單添加爲子程序崩潰時,我會通過保留菜單來解決這個問題**,但是我不明白爲什麼**。屬性菜單是非原子的,保留,它應該已經保留。 –
是的,但只有當你使用財產!你只使用指針。所以使self.menu = – Chakalaka