2011-10-07 5 views
0

だから、NIPimerを持つUIPopoverを持っています。他のメソッドを実行するために、さまざまなBOOLSとプロパティがありますが、それは今のところ重要ではありません。私が知りたいことは、Popoverの親ビューが消えたときにタイマーを解放して無効にする方法があるかどうかです。私はクラスメソッドを無効にして、タイマーをリリースしようとしましたが、彼らは私にSIGABRTとEXC_BAD_ACCESSの警告を与えました。私はそれが既に無かったときにdeallocに言われているタイマーと関係があると思います。UIPopoverでNSTimerを停止する

カップル余分な要因:ポップオーバーが却下されたときに 1.タイマーが有効のままとalloc'dなければなりません。 2.親ビューが消えた場合、タイマーは無効化と解除が必要です。

提案がありますか?

CODE:

//@interface 
    NSTimer *clickTimer; 
@property (nonatomic, retain) NSTimer *clickTimer; 

//.m 
- (IBAction)clickerPressed:(id)sender 
{ 
if ([click isClicking] == YES) { 
    [clickTimer invalidate]; 
    [clickTimer release]; 
    clickTimer = nil; 
    // enable the idle timer when the clicking is turned off 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
    [click setIsClicking:NO]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal]; 
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]]; 
    [click setClickCount:0]; 

} 
else { 
    // disable the idle timer while the metronome is clicking. 
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; 
    [click setIsClicking:YES]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Stop" forState:UIControlStateNormal]; 
    [[NSThread currentThread] setThreadPriority:1.0]; 

    clickTimer = [[NSTimer scheduledTimerWithTimeInterval:[click clickRateInSeconds] target:self selector:@selector(click:) userInfo:nil repeats:YES]retain]; 
    } 

}

+1

でのdeallocの外で変数を解放常に常には、ゼロに設定します。 '[clickTimer release]; clickTimer = nilを; ' – Joe

+0

編集、申し訳ありません CodaFi

答えて

2

自動的ポインタにnilを割り当てないオブジェクトを解放します。リリース文の後にclickTimer = nil;を追加します。これにより、他のメソッドが無効なオブジェクトにアクセスしようとすると、clickTimerが解放されます。

- (void) invalidateClickTimer 
{ 
    // invalidate timer 
    if (clickTimer == nil) 
     return; 
    [clickTimer invalidate]; 
    [clickTimer release]; 
    clickTimer = nil; 

    // stop clicking 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
    [click setIsClicking:NO]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal]; 
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]]; 
    [click setClickCount:0]; 
    return; 
} 

あなたはあなたのためのタイマーを無効にする方法を作成するのではなく、それぞれの方法は、タイマーを無効にすることを検討かもしれませんが、あなたの方法のすべてが正しく ゼロclickTimerを設定することを確認するために、

:そして、このラインで - (IBAction)clickerPressed:(id)sender

if ([click isClicking] == YES) { 
    [clickTimer invalidate]; 
    [clickTimer release]; 
    clickTimer = nil; 
    // enable the idle timer when the clicking is turned off 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
    [click setIsClicking:NO]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal]; 
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]]; 
    [click setClickCount:0]; 
} 

に次の行を置き換えます3210

if ([click isClicking] == YES) { 
    [self invalidateClickTimer]; 
} 

親ビューのUIViewControllerから新しいメソッド- (void) invalidateClickTimerを呼び出します。おそらく方法- (void)viewWillDisappear:(BOOL)animated

+0

おかげで、私はそれを今... – CodaFi

+0

いや、ないサイコロをしようとしています。タイマーは無効にされ、あなたの方法で無制限にされますが、それはクリックを停止しません。 – CodaFi

+0

何かクリックを止めませんか? –

関連する問題