1. ホーム
  2. objective-c

[解決済み] NSTimerの使い方を教えてください。

2022-03-16 04:59:47

質問

を使用するにはどうすればよいのでしょうか? NSTimer ? どなたか、ステップバイステップで教えていただけませんか?

どのように解決するのですか?

まず最初に、Cocoa/CFのドキュメントに注目していただきたいと思います(これは常に、最初に呼び出すべき素晴らしいポートです)。Appleのドキュメントには、各参考記事の上部に"Companion Guides"というセクションがあり、ドキュメント対象のトピックに関するガイドが(存在すれば)リストアップされています。例えば NSTimer , ドキュメント には、2冊のコンパニオンガイドが掲載されています。

スレッドのトピックは関連性がありますが、ドキュメント化されているクラスには直接関係ありません。Timer Programming Topicsの記事を見ると、2つのパートに分かれています。

  • タイマ
  • タイマーを使う

このような形式の記事では、クラスの概要とその用途について説明し、その後に どのように この場合は、「タイマーを使う」のセクションで説明しています。タイマーの作成とスケジューリング」「タイマーの停止」「メモリ管理」のセクションがあります。この記事から、スケジュールされた繰り返しのないタイマーを作成するには、次のようにします。

[NSTimer scheduledTimerWithTimeInterval:2.0
    target:self
    selector:@selector(targetMethod:)
    userInfo:nil
    repeats:NO];

これは、2.0秒後に起動するタイマーを作成し、そのタイマーから targetMethod:self へのポインタを1つの引数として与えます。 NSTimer のインスタンスです。

もし、このメソッドについてもっと詳しく知りたい場合は、ドキュメントを参照すればよいのですが、コードの周りにも説明があります。

繰り返しのタイマーを停止したい場合(または、非繰り返しタイマーを起動前に停止したい場合)には、タイマーを停止させるためのポインタを NSTimer 多くの場合、これはインスタンス変数にする必要があり、別のメソッドでそれを参照できるようにします。そうすると invalidate の上で NSTimer のインスタンスを作成します。

[myTimer invalidate];
myTimer = nil;

また、次のようにするのもよい方法です。 nil に設定されていない場合、インスタンス変数をアウトにします (たとえば、タイマーを無効にするメソッドが複数回呼び出され、インスタンス変数が nil と、その NSTimer のインスタンスが解放されている場合は、例外をスローします)。

また、記事末尾の「メモリ管理」のポイントにもご注目ください。

<ブロッククオート

ランループがタイマーを維持するため、メモリ管理の観点から タイマーをスケジュールした後は、通常、タイマーへの参照を保持する必要はありません。 . タイマーのメソッドをセレクタで指定すると引数として渡されるため。 そのメソッド内で適切なタイミングでリピータータイマーを無効化することができます。 . しかし、多くの場合、タイマーを無効化するオプションが必要です(おそらく、タイマーが開始する前でも)。 この場合、タイマーへの参照を保持し、適切なタイミングで無効化メッセージを送信できるようにする必要があります。 . 非スケジュール型タイマーを作成する場合(「非スケジュール型タイマー」を参照)、タイマーへの強い参照を維持し(参照カウントの環境では、それを保持し)、使用前にタイマーの割り当てが解除されないようにする必要があります。