6

このようにタイマーを追加します

tim=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeatTim) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:tim forMode:NSDefaultRunLoopMode];

timそれは私のクラスの NSTimer プロパティです。

次に、ボタンのクリックで停止します

[[fbt tim] invalidate];
[fbt setTim:nil];

fbt それは私のクラスのインスタンスです。

無効化のみを呼び出すと停止しませんが、nil に設定すると EXC_BREAKPOINT を取得しました

セレクターのrepeatTimメソッドのコード

AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
[appDelegate.wbv stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"intal()"]];

initを呼び出して無効化しようとしまし

dispatch_async(dispatch_get_main_queue(), ^{})

タイマーも止まりません。

4

3 に答える 3

4

NSTimer のドキュメントを読む:

タイマーを作成するには、次の 3 つの方法があります。

  1. ScheduledTimerWithTimeInterval:invocation:repeats: またはscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:クラスメソッドを使用してタイマーを作成し、デフォルトモードで現在の実行ループでタイマーをスケジュールします。

  2. timerWithTimeInterval:invocation:repeats: または timerWithTimeInterval:target:selector:userInfo:repeats: クラス メソッドを使用して、実行ループでスケジュールせずにタイマー オブジェクトを作成します。(タイマーを作成したら、対応する NSRunLoop オブジェクトの addTimer:forMode: メソッドを呼び出して、手動で実行ループにタイマーを追加する必要があります。)

  3. タイマーを割り当て、initWithFireDate:interval:target:selector:userInfo:repeats: メソッドを使用して初期化します。(タイマーを作成したら、対応する NSRunLoop オブジェクトの addTimer:forMode: メソッドを呼び出して、手動で実行ループにタイマーを追加する必要があります。)

1 から mainLoop に既に追加しているメソッドを使用しています。 - この行を削除するか、2 でタイマーを作成する必要があります。

また、タイマーがインストールされたスレッドから無効化メッセージを送信する必要があることも忘れないでください。このメッセージを別のスレッドから送信すると、タイマーに関連付けられた入力ソースが実行ループから削除されず、スレッドが正常に終了できなくなる可能性があります。

于 2013-09-11T15:30:29.767 に答える