質問

アプリケーションに2つのタイマーを設定し、両方とも数秒ごとに繰り返します。 タイマーを無効にする時間を除いて、すべて正常に動作します。 電話がロックされている場合、これらのタイマーを無効にし、電話がロック解除されたときにそれらを再作成します。

通知を使用して、タイマーを無効化/作成するタイミングを認識しています。

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_didBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_willResigneActive:) name:UIApplicationWillResignActiveNotification object:nil];

これはnotify_didBecomeActiveメソッドに含まれるものです:

clockTicker = [[NSTimer scheduledTimerWithTimeInterval: 1  
                                            target: self  
                                          selector: @selector(showActivity)  
                                          userInfo: nil  
                                           repeats: YES] retain];

alarmTicker = [[NSTimer scheduledTimerWithTimeInterval: CONST_ALARMTIMER  
                                               target: self  
                                             selector: @selector(checkAndLaunchAlarm)  
                                             userInfo: nil  
                                              repeats: YES] retain];

notify_willResigneActiveメソッドには次のものが含まれます。

if (alarmTicker) {
    [alarmTicker invalidate];
    [alarmTicker release];
    alarmTicker = NULL;
}

if (clockTicker) {
    [clockTicker invalidate];
    [clockTicker release];
    clockTicker = NULL;
}

問題は、2番目のタイマーの無効化でこれをデバッグすると、エラーが発生することです。 奇妙なことは、タイマーの順序を変更すると(最初にclockTickerが無効になるなど).. 2番目のタイマーでエラーが発生することです。

何が間違っているのでしょうか?

ありがとう、 レオナルド

役に立ちましたか?

解決

invalidateはタイマーを解放し、無効化後に解放する必要がないため、クラッシュします。しかし、私はあなたがタイマーを保持していることに気づいた...これが必要かどうかわからない。

他のヒント

(alarmTicker)またはif(clockTicker)の値が正しいかどうかを確認するときに、それらのタイマーが起動するメソッド内でalarmTickerとclockTickerをnilに設定する必要があります。

nilに設定するのではなく、タイマーをNULLに設定するとどうなるかわかりませんが、nilオブジェクトを呼び出した場合、何もしないことを知っています。 NULLオブジェクトで呼び出しを行うと、クラッシュしたと見なされますが、これは確認していません。この投稿は役に立つかもしれません: Objective-CでのNULLとnil

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top