2012-08-30 10 views
6

NSTimerオブジェクトを作成したくありません。タイマーを無効にするにはどうすればよいですか?私はviewWillDisappearのタイマーを無効にしたい。あなたが作成し、タイマーを保持する必要がNSTimerオブジェクトを作成しないとタイマーを無効にする方法

-(void) viewDidLoad 
{ 
[super viewDidLoad]; 
[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 
} 
+0

* NSTimerオブジェクト*を作成したくありません。 'scheduledTimerWithTimeInterval'を使って既に作成しています。 – sch

+0

私は私が作成するタイマーを保持していないということです。出来ますか? – Voloda2

答えて

3

@interface MONObject() 
@property (nonatomic, retain) NSTimer * timerIvar; 
@end 

@implementation MONObject 
... 
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
self.timerIvar = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 
} 

- (void)invalidateTimer 
{ 
    [self.timerIvar invalidate]; 
    self.timerIvar = nil; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    ... 
    [self invalidateTimer]; 
} 

B

別のオプションが渡されたタイマーを無効にするだろうコールバックでは、それはviewDidUnload:内には発生しません。したがって、それは非常にこのシナリオでは適用されません。

- (void)onTimer:(NSTimer *)pTimer 
{ 
    [pTimer invalidate]; 
} 
0

たぶん、この方法は、あなたを助けることができる:

[self performSelector:@selector(onTimer:) withObject:nil afterDelay:10]; 
1

あなたはタイマーを取り消すことができるようにしたい場合は、を参照する必要があなたがキャンセルしているタイマー、それは周りのタイマーへのポインタを保持する必要があることを意味し、ジャスティンの答えを参照してください。

タイマーへの参照は正しい方法ですが、完全性のために貧しい人のタイマーとして-performSelector:withObject:afterDelay:メソッドを使用することもできます。その呼び出しは+cancelPreviousPerformRequestsWithTarget:を使用して無効にすることができます。サンプルコード:

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self performSelector:@selector(timerTick) withObject:nil afterDelay:10]; 
} 

そして:

- (void) viewWillDisappear 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    [super viewWillDisappear]; 
} 

しかし、あなたはキャンセルしますあなたのオブジェクト上で保留中の他の実行セレクタの要求があるかもしれないので、これは、それを行うには正しい方法ではありません。タイマーを守るのが最善です。キャンセルするものを正確に知ることができます。

ちなみに、-viewDidLoadでタイマーを実行するのは悪い考えです。ビューの読み込みは、表示されるビューとは関係なく、いつでも実行できます。

0

あなたのタイマーを保持したくない場合は、NSTimerオブジェクトがタイマーメソッド(あなたの場合はonTimer :)に渡されるため、そのメソッドでタイマーがまだ必要かどうかをチェックして無効にすることができますそれ。ただし、タイマーを無効にする前にビューが戻ってきて、新しいタイマーを作成すると、問題が発生します。

これまでのところ、タイマーをインスタンス変数に格納するのが最善の方法です。それは機能し、巧妙なトリックはなく、6ヶ月後にあなたがしたことを知るでしょう。私はおそらく

@property (readwrite, nonatomic) BOOL hasTimer; 

ゲッターはタイマーがゼロでないときに限り、セッターはタイマーを無効にするか、新しいものを作成し、YESを返し記述します。

関連する問題