表示されている問題の直接の原因ではないかもしれませんが、既に 1 つの大きなエラーを特定できます。
このタイマーが毎回設定されるviewWillAppear
ということは、ビューが表示されるたびに、作成後 60 秒で起動する新しいタイマーを作成する (そして古いタイマーをリークする) ことを意味します。
ビューが何度も消えて再表示される場合、複数のタイマーがすべて完全にランダムな間隔で同じメソッドを起動することになります。
タイマーを適切に管理する必要があります。ビューが最初に作成されたときに開始し、ビューが表示されていないときでもカチカチ/起動し続けるようにする場合は、 または の間に作成しinit
、 またはviewDidLoad
のときに必ず停止する必要がありdealloc
ますviewDidUnload
。
ビューが現在のビューである場合にのみタイマーを作動させたい場合は、 と でタイマーの停止と開始を適切に管理していることを確認する必要がありviewDidAppear
ますviewWillDisappear
。
また、Williham Totland が回答で述べたように、正確なタイミングを NSTimer に頼るべきではありません。これは、ドキュメントにも記載されています。
タイマーはリアルタイムのメカニズムではありません。タイマーが追加された実行ループ モードの 1 つが実行中で、タイマーの起動時間が経過したかどうかを確認できる場合にのみ起動します。典型的な実行ループが管理するさまざまな入力ソースのため、タイマーの時間間隔の有効な分解能は 50 ~ 100 ミリ秒程度に制限されます。実行ループがタイマーを監視していないモードにあるとき、または長いコールアウト中にタイマーの起動時間が発生した場合、実行ループが次にタイマーをチェックするまで、タイマーは起動しません。したがって、タイマーが潜在的に起動する実際の時間は、スケジュールされた起動時間よりもかなりの時間になる可能性があります。
この場合、タイム スパンが 60 秒であるため、タイマーが正確でなくても問題はありません。タイマーが適切に管理されていないことが原因だと思います。