2011-01-26 11 views
1

これはおそらく私が今知っておくべきことです。私はNSTimerクラスメソッドを使ってNSTimerのインスタンスを作成しています。返されたオブジェクトがオートレリースされていることを確信しています。私の質問は、タイマオブジェクト(メソッド:1)を保持して解放したり、単に@property(: 2)(または私は完全に異なる何かをすべきか?)クラスメソッドで作成されたオブジェクトを保持していますか?

// METHOD: 1 
@property (nonatomic, retain) NSTimer *myTimer; 

NSTimer *tempTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(executeOnTimer) userInfo:nil repeats:YES]; 
    [self setMyTimer:tempTimer]; 
    //[tempTimer release]; 

- (void)dealloc { 
    [pulseTimer release]; 
    [super dealloc]; 
} 

または単に:

// METHOD: 2 
myTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(executeOnTimer) userInfo:nil repeats:YES]; 

編集:私はちょうど書いた場合

一つの最後のポイント、プロパティに割り当てずに(下記参照)は、タイマーをしようとしているすべての可能性があります割り当てが解除されると、基本的にはプログラムが終了するまで周りにいます。それがどのように保持されているのか不思議です。

[NSTimer scheduledTimerWithTimeInterval:120.0 target:self selector:@selector(executeOnTimer) userInfo:nil repeats:YES]; 
+0

'NSTimer'には特別な配慮があります。 'scheduledTimerWithTimeInterval ...'メッセージはタイマーを開始するだけでなく、それをrunloopに追加します。これにより、 'NSTimer'が解放されるのを防ぎ、実行ループ内部から所有権を取り戻すために' invalidate'メソッドを呼び出す必要があります。 [ - (void)invalidate]の詳細(http://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/instm/ NSTimer /無効化)。 –

答えて

2

self.myTimer = [NSTimer scheduledTimerWithTimeInterval: ...]; // implicit setter 

または

[self setMyTimer: [NSTimer scheduledTimerWithTimeInterval:...]]; // explicit setter 

または

myTimer = [[NSTimer scheduledTimerWithTimeInterval: ...] retain]; 

または

self->myTimer = [[NSTimer scheduledTimerWithTimeInterval: ...] retain]; 
+0

2番目の例でmyTimerを2回保持しているので、一度解放する必要があります。 –

+0

@Time Machine:最初の例では、[self setMyTimer:[NSTimer ...]]と同じ書いています。だから、一度だけ。まだNSTimer –

+0

への参照が必要な場合は 'release'はありません。私は2番目の例を示しました。 –

1

これは良い方法です:

self.myTimer = tempTimer; 
// don't call [tempTimer release] 

これが原因それを保持プロパティにautomcailcallyそれを保持します。

ちょうどmyTimer = …を呼び出しても、self.myTimer = …はセッターを使用しません。あなたは同じ効果でこれらのいずれかを行うことができNSTimerの上に所有権を取得するために

+0

エピックスペルが失敗します。愚かな小さなiPodのキーボード。 –

+0

これは、リリースメッセージなしのMETHOD 1と等しいことに注意してください。 –

+0

私はタイマーを所有していないので、私はリリースを必要としません(すなわち、allocはありません)。私のプロパティは、[self setMyTimer:tempTimer];またはself.myTimer = tempTimer;保持されているものとdeallocのリリースとのバランスがとれています。 – fuzzygoat

関連する問題