2010-12-04 10 views
3

IBActionがアタッチされたボタンがあるとします。これを押すといくつかのアクションがトリガされますが、1秒の遅延で特定のアクションをトリガする必要があります。この1秒の遅れで新しい時間ボタンを押してください。 コード次のようになります、このコードの動作が非常に細かいであるためiPhone:NSTimerでメモリリークの問題がほとんど発生しない

@interface Image : UIView { 
      NSTimer *timer; 
    } 
    ...other things...; 
    @end 

    @implementation Image 
    -(IBAction)startStopTimer{ 
    ...do something...; 
    ...do something...; 

    [timer invalidate]; 
    timer = [[NSTimer scheduledTimerWithTimeInterval:0.7 
     target:self 
     selector:@selector(delayedAction) 
     userInfo:nil 
     repeats:NO] retain]; 
    } 

    -(void)delayedAction{ 
    ...do other things...; 
    } 
    @end 

:「delaiAvanceは、」ユーザーがボタンをもう一度押すと、少なくとも1つの第2のために待っていない場合にのみトリガされます。

大きな問題は、タイマーが起動するたびにメモリリークが発生することです。

ですから、このNSTimerをどのようにしてリリースしなければならないのですか?

(deallocメソッドで、[タイマー解除]は動作しません。)

答えて

5

を私の知る限りでは、それらが「システム」によって保持されているので、あなたがNSTimerオブジェクトを保持しません。 invalidateを実行すると、システムからそれをリリースします。

とにかくperformSelector:withObject:afterDelay:を使用することをお勧めします。トリガーを簡単に取り消すことができ、オブジェクト全体を作成する必要はありません。あなたは

- (void)buttonPressed 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething) object:nil]; 
    [self performSelector:@selector(doSomething) withObject:nil afterDelay:0.7]; 
} 

- (void)doSomething 
{ 
    NSLog(@"Something happens now!"); 
} 

を行いたいタイマーを起動するには、キャンセルの理由は、あなたが0.7秒の期間中にもう一度ボタンをクリックすると、「タイマー」が解除され、新しいものが作成され、その結果です。

+1

こんにちはジョー、アドバイスいただきありがとうございます!それは魅力のように動作します!私はすでにperformSelectorで試してみましたが、私はそれをキャンセルできることを知らなかった!キャンセルの構文でちょっとしたエラーがありました。 "[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething)object:nil];"再度、感謝します ! – Chrysotribax

+0

おっと、愚かな私!私は他の人のためにそれを上に改めました。ありがとう! – jowie

0

したがって、問題は:どのようにそしてどこで行うのですか? このNSTimerをリリースする必要がありますか?

あなたはありません。実行ループは、invalidateメソッドを呼び出した後、しばらくの間、タイマーを保持します。したがって、scheduledTimerWithTimeIntervalの呼び出しで余分なretainを削除するだけで済みます。

+1

OPはそれを保持していたので、それらは 'dealloc'で解放する必要があります。もしそれがまだ外出予定の場合、それはすぐに解放されないかもしれません。 – bbum

+0

私は彼に余分な遺骨を落とすように言っています。だから私はそのリリースの必要はないと書いています。 – zoul

+0

OK、良い方法は、単に "performselector"と、下にあります。しかし、まだ、私は保持をドロップすると、アプリが数秒後にクラッシュする... – Chrysotribax

関連する問題