我一直使用 ARC,但我的 cocos2d 模板不使用 ARC,因为我必须使用手动引用计数,这可能就是我崩溃的原因。
目标是制作一个带有两个标签的菜单,如果我点击一个标签,我会显示一个带有精灵的图像。如果我点击图像,我可以返回菜单并再次选择。
这是 CCLayer 类:
-(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 等...),但没有一个项目有这个地址。有时我什至得到一个无效的地址,比如 0x00000008 。
编辑
我会通过保留菜单来解决问题,但我不明白为什么:菜单已经保留:
@property (nonatomic, retain) CCSprite* shark;
@property (nonatomic, retain) CCSprite* icon;
@property (nonatomic, retain) CCMenu* menu;
如果我启用僵尸,我会得到:
*** -[CCMenu tag]: message sent to deallocated instance 0x7c71a10
所以菜单是一个僵尸,但保留属性不应该让它被保留吗?
奇怪的是我不需要保留鲨鱼和图标,只需要菜单。