1

iPhone アプリに timer1 と timer2 という 2 つの NSTimer がある ますtimer1はfunction1を毎秒 30 回呼び出し、timer2function2を毎秒 30 回呼び出します。これら 2 つの関数が同じ整数変数の読み取りと更新を行っているとします。ここに「マルチスレッド」の問題はありますか? そうでない場合、iPhone OS は 2 つの関数の実行を (一般的に) どのように処理しますか?

4

2 に答える 2

5

すべての iPhone アプリケーション (およびその他のプラットフォーム) の中核は実行ループです。各スレッドには実行ループがあり、メイン スレッドの実行ループは自動的に設定されます。NSTimer を起動したり、ビュー階層を描画したりするなど、何かする必要がある場合、実行ループがそれらのタスクを実行します。何もすることがない場合、実行ループはアイドル状態になり、他の処理が可能になります。

実行ループの内部はスレッド対応であるため、実行ループによって処理されるものは何もありません。すべての NSTimer コールバックとビューのレンダリングは、シリアルまたはリニア フローの単一スレッドで発生します。

具体的な詳細については、NSRunLoop または CFRunLoop を検索できます。

于 2010-05-09T22:39:38.317 に答える
2

私の知る限り、NSTimers は実行ループを使用して「非同期性」を実現しています。タイマーがscheduledTimerWith...メソッドを使用して作成された場合、デフォルト(メイン)の実行ループでスケジュールされ、メインスレッドで実行されます。

タイマー用の新しいスレッドは作成されないと思います(明示的に作成し、タイマーをその実行ループに割り当てない限り)。

結局のところ、2 つのタイマーが競合するべきではないと思います。

ただし、ドキュメントには、タイマーはリアルタイムを表していないと記載されています。タイマーはスケジュールされた時刻以降に起動しますが、スケジュールされた時刻に正確に起動することは保証されていません。したがって、起動されたメソッドの実行にタイマーの間隔よりも長い時間がかかる場合、メソッドが期待どおりに頻繁に呼び出されないことがあります。

そうは言っても、あなたが質問している特定の理由はありますか?この設定を使用して望ましくない動作が見られますか?

于 2010-05-09T22:39:32.453 に答える