0

私はいつもARCを使用していましたが、cocos2dテンプレートはARCを使用していません。手動の参照カウントを使用する必要があるため、おそらくクラッシュします。
目標は、2つのラベルでメニューを作成することです。ラベルをクリックすると、スプライト付きの画像が表示されます。画像をクリックすると、メニューに戻ってもう一度選択できます。
これは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)

すべてのアドレス(menu、item1、etc ...)を印刷しようとしましたが、どのアイテムにもこのアドレスがありません。0x00000008のような無効なアドレスを取得することもあります。

編集

メニューを保持するだけで問題を解決できますが、理由がわかりません。メニューはすでに保持されています。

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

ゾンビを有効にすると、次のようになります。

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

つまり、メニューはゾンビですが、retainプロパティで保持するべきではありませんか?
奇妙なことに、私はサメとアイコンを保持する必要はなく、メニューだけを保持する必要があります。

4

1 に答える 1

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

メニューは保持されませんでした。その保持プロパティがself.menuを使用する場合

あなたは毎回新しいサメを作りますが、あなたのメニューを再利用したいです!

于 2012-12-06T13:05:24.933 に答える