1

私はCoco2Dで小さなゲームをしていて、カウントダウンクロックを持っています 注:バグを修正しようとしているだけなので、タイマーを停止できるようにクリーンアップに取り組んでいません。ラベルを設定し、タイマーを開始します。

timer = [CCLabelTTF labelWithString:@"10.0000" fontName:@"Helvetica" fontSize:20]; 
        timerDisplay = timer;
        timerDisplay.position = ccp(277,310);
        [self addChild:timerDisplay];
        timeLeft = 10;

        timerObject = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];

注:timeLeftはdoubleです

これはupdateTimersのコードです:

 -(void)updateTimer {
         NSLog(@"Got Called!");

         timeLeft = timeLeft -0.1;
     [timer setString:[NSString stringWithFormat:@"%f",timeLeft]];
       timerDisplay = timer;
         timerDisplay.position = ccp(277,310);
         [self removeChild:timerDisplay cleanup:YES];
         //[self addChild:timerDisplay];  
       if (timeLeft <= 0) {
             [timerObject invalidate];
         }     

     }

私がこれを実行するとき、私はこれでクラッシュすることを切り替えます: [timer setString:[NSString stringWithFormat:@"%f",timeLeft]]; そしてそれが与える緑色の矢印のものThread 1: EXEC_BAD_ACCESS (code=2, address=0x8)0x197a7ff: movl 16(%edi), %esiそれが与える緑色の矢印のものThread 1: EXEC_BAD_ACCESS (code=2, address=0x8)

4

1 に答える 1

0

便利なメソッドで初期化されたため、「タイマー」(テキストオブジェクトIMHOの名前としてはあまり適切ではありません)が自動リリースされているようです。したがって、タイマーが起動すると、解放されたオブジェクトを操作しようとしている可能性があります。これを修正するには、次の2つの方法があります。オブジェクトを自分で割り当てて初期化するか、b。次のような「保持」メッセージを追加します。

[[CCLabelTTF labelWithString:@"10.0000" fontName:@"Helvetica" fontSize:20] retain]; 

どちらの場合も、完了したら、deallocまたは同様のメソッドでオブジェクトを解放する必要があります。

[timer release];
于 2012-06-10T23:03:33.520 に答える