タイマーは、あなたが考えているようには「実行」されません。「カウントダウン」はありません。タイマーは、実行ループにマーカーを追加して、特定の時間に特定のメッセージを送信するだけです。runloop が実行されるたびに、いずれかのタイマーが期限切れになっていないかどうかがチェックされます (「今」が開始日より後の場合)。その場合、要求されたメッセージをdrawRect:
、タッチイベントの呼び出しや処理などの他のことと同じ方法で送信します。これは多かれ少なかれ巨大なwhile (true)
ループであり、ループ内の 1 つが「期限切れタイマーの起動」です。
それで、それはどういう意味ですか?これは、指定された実行ループが「ポンピング」(処理) されている場合にのみ、タイマーが起動することを意味します。通常、これはメインの実行ループであり、アプリケーションがアクティブな間だけ処理されます。非アクティブになった場合 (通常、ユーザーが別のアプリに移動したとき)、実行ループは処理されません。非アクティブな間に期限が切れたすべてのタイマーは、戻ってきたときに起動します (これが、通常、バックグラウンドに入る前にタイマーを無効にしたい理由です)。(非メインの実行ループはもう少し複雑ですが、非常にまれです。ただし、バックグラウンドで無期限に実行されることはありませんが、実行に失敗する場合が多くあります。)
一方、終了した場合 (バックグラウンドにいる間に予告なしに発生する可能性があります)、実行ループはすべてなくなります。再起動すると、タイマーはインスタンス化されません。あなたがそれを望むなら、それはあなたの仕事です。したがって、タイマーが起動することに頼ることはできません。
が含まれているためrepeats:YES
、タイマーは自動的に再スケジュールされます。繰り返しますが、これは「カウントダウン」または「まだ実行中」などの意味ではありません。それが起動すると、別のタイマーイベントが自動的にスケジュールされることを意味します。そのため、ユーザーが「OK」ボタンを十分に長く押し続けると、タイマーが再び起動します (iOS では、Mac では状況が少し異なり、「モード」がより重要になります)。
メソッドの「スケジュールされた」部分は、タイマーがすでに実行ループに追加されていることを意味しscheduledTimerWithTimeInterval:...
ます。addTimer:...