342

を使用するにはどうすればよいNSTimerですか? 誰かが私に段階的な指示を与えることができますか?

4

6 に答える 6

614

まず最初に、Cocoa/CF のドキュメントに注目していただきたいと思います (これは常に最初の呼び出し先として最適です)。Apple ドキュメントには、各参照記事の上部に「コンパニオン ガイド」と呼ばれるセクションがあり、ドキュメント化されているトピックのガイドがリストされています (存在する場合)。たとえばNSTimerドキュメントには 2 つの関連ガイドがリストされています。

あなたの状況では、Timer Programming Topics の記事が最も役立つ可能性が高く、スレッドのトピックは関連していますが、文書化されているクラスに最も直接関連しているわけではありません。Timer Programming Topics の記事を見ると、次の 2 つの部分に分かれています。

  • タイマー
  • タイマーの使用

この形式の記事では、多くの場合、クラスの概要とその使用目的、およびその使用方法に関するいくつかのサンプル コード(この場合は「タイマーの使用」セクション) があります。「タイマーの作成とスケジュール」、「タイマーの停止」、「メモリ管理」のセクションがあります。記事から、スケジュールされた繰り返しのないタイマーを作成するには、次のようにします。

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

これにより、2.0 秒後に起動されるタイマーが作成され、インスタンスへのポインターである 1 つの引数で呼び出さtargetMethod:れます。selfNSTimer

その後、メソッドをさらに詳しく調べたい場合は、ドキュメントを参照して詳細を確認できますが、コードに関する説明もあります。

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

[myTimer invalidate];
myTimer = nil;

インスタンス変数をアウトすることもお勧めしnilます (たとえば、タイマーを無効にするメソッドが複数回呼び出され、インスタンス変数が設定されておらずnilNSTimerインスタンスの割り当てが解除されている場合、例外がスローされます)。

記事の下部にあるメモリ管理のポイントにも注意してください。

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

于 2009-09-19T17:58:34.060 に答える
330

タイマーを使用するには、いくつかの方法があります。

1)スケジュールされたタイマーとセレクターの使用

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 2.0
                      target: self
                      selector:@selector(onTick:)
                      userInfo: nil repeats:NO];
  • 繰り返しを NO に設定すると、タイマーはセレクターを実行する前に 2 秒間待機し、その後停止します。
  • repeat: YES の場合、タイマーはすぐに開始され、2 秒ごとにセレクターの呼び出しを繰り返します。
  • タイマーを停止するには、タイマーの -invalidate メソッドを呼び出します: [t invalidate];

補足として、指定された間隔の後に繰り返されずにセレクターを呼び出すタイマーを使用する代わりに、次のような単純なステートメントを使用できます。

[self performSelector:@selector(onTick:) withObject:nil afterDelay:2.0];

これは、上記のサンプル コードと同じ効果があります。ただし、n 回ごとにセレクターを呼び出したい場合は、repeats:YES; でタイマーを使用します。

2)セルフスケジュールタイマー

NSDate *d = [NSDate dateWithTimeIntervalSinceNow: 60.0];
NSTimer *t = [[NSTimer alloc] initWithFireDate: d
                              interval: 1
                              target: self
                              selector:@selector(onTick:)
                              userInfo:nil repeats:YES];

NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer:t forMode: NSDefaultRunLoopMode];
[t release];
  • これにより、指定したカスタム日付 (この場合は 1 分後) に開始され、1 秒ごとに繰り返されるタイマーが作成されます。

3)予定外のタイマーと呼び出しの使用

NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn];
[inv setTarget: self];
[inv setSelector:@selector(onTick:)];

NSTimer *t = [NSTimer timerWithTimeInterval: 1.0
                      invocation:inv 
                      repeats:YES];

その後、次のように必要なときはいつでもタイマーを手動で開始します。

NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer: t forMode: NSDefaultRunLoopMode];



注意として、 onTick: メソッドは次のようになります。

-(void)onTick:(NSTimer *)timer {
   //do smth
}
于 2009-09-19T17:58:50.603 に答える
59

このようなもの:

NSTimer *timer;

    timer = [NSTimer scheduledTimerWithTimeInterval: 0.5
                     target: self
                     selector: @selector(handleTimer:)
                     userInfo: nil
                     repeats: YES];
于 2009-09-19T17:30:37.050 に答える
5
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(timerCalled) userInfo:nil repeats:NO];

-(void)timerCalled
{
     NSLog(@"Timer Called");
     // Your Code
}
于 2014-03-24T07:20:07.007 に答える