2011-01-23 8 views
0

私は画面上を移動するボタンを含むゲームを作っています。 1つのボタンがタップされずに画面の端に達すると、健康状態が失われます。あなたはそれがこれで問題がまだ存在すると、画面を横切って移動する続けてボタンです[btn removeFromSuperview]を使用してdisapearsボタンをクリックし目的C:UIButtonsを削除する(removeFromSuperviewだけではありません)

-(void) moveStickFig:(NSTimer *)timer { 
UIButton *stick = (UIButton *)timer.userInfo; 
CGPoint oldPosition = stick.center; 
stick.center = CGPointMake(oldPosition.x + 1 , oldPosition.y); 
if (oldPosition.x == 900) { 
    [stick removeFromSuperview]; 
    healthCount--; 
    NSLog(@"%d", healthCount); 
    } 
} 

。それを完全に削除する方法はありますか?私は[stick release]を試しましたが、何らかの理由でアプリがフリーズするだけです。

+0

"画面から外す"方法はありますか? – aqua

答えて

1

リピートタイマーを使用してボタンを移動しているようです。タイマーを明示的に終了しないと、タイマーは継続して実行され、ボタンが移動します。

通常、ボタンのようなものにremoveFromSuperviewメッセージを送信すると、そのオブジェクトの割り当てが解除または削除されます。これは、ボタンがスーパービューに追加されると、スーパービューはボタンを保持し、保持カウントを1にし、スーパービューから削除すると、ボタンを解放して保持カウントが0になるためです。

しかし、ボタンはtimerのuserInfoとして保存されているため、タイマーはオブジェクトの保持カウントを2にします。スーパービューから削除すると、保持カウントは1になります。ボタンにメッセージを送信すると、保持カウントは0になり、のボタンの割り当てを解除しますが、タイマーは停止しません。次回にタイマーを実行すると、割り当て解除されたメモリにアクセスしようとするため、問題が発生します。

本当にやりたいことは、タイマーを無効にすることです:[timer invalidate]。これにより、タイマーが停止し、タイマーはボタンに解放メッセージを送信し、ボタンの割り当てが解除されます。

1

NSTimerは、あなたのケースのボタンオブジェクトであるuserInfoを保持しています。 [timer invalidate]を使用してタイマーを強制終了する必要があります。

関連する問題