NSTimerが無効になったときにiPhoneでEXC_BAD_ACCESSを使用するとクラッシュする
-
22-07-2019 - |
質問
アプリケーションに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