2011-10-23 10 views
0

私のコードで何が間違っているかを指摘してください。私は私のカスタムタイプの変数idleTimerを定義します保持/解放 - 参照数

@property(nonatomic、retain)IdleTimer * idleTimer;

次のコードを実行すると、クラッシュします。

IdleTimer *idleTimerTemp = [[IdleTimer alloc] initTimer:PERIOD_COUPON_POPUP]; 
idleTimer = idleTimerTemp; 

NSLog(@"Pt. 1 %d %d", [idleTimerTemp retainCount], [idleTimer retainCount]); 

[idleTimer setDelegate:self]; 
[idleTimerTemp release]; 
NSLog(@"Pt. 2 %d %d", [idleTimerTemp retainCount], [idleTimer retainCount]); 

idleTimerを再度使用すると、クラッシュします。

しかし、私は "idleTimer = idleTimerTemp"にidleTimerTempを保持しています。全くクラッシュしない。

しかし、私の変数はretainと定義されています。なにが問題ですか ?

+0

iOSでXCODE 4.2を使用しています。 – SkyEagle888

+0

補足として[-retainCountはそれほど有用ではありません](http://stackoverflow.com/questions/4636146/when-to-use-retaincount/4636477#4636477) )。 –

答えて

2

あなたのプロパティはretainと定義されていますが、プロパティのバッキングストレージであるインスタンス変数に関しては何もしません。おそらくあなたのコードのどこかで、@synthesize idleTimer;をやったことがあります。これは、あなたが要求したメモリ管理を実装するアクセサペアを作成します。

その動作を取得する唯一の方法は、アクセサそのものを呼び出すことです。したがって、idleTimerに直接割り当てると、何も行われませんが、self.idleTimer = idleTimerTempを使用すると、-setIdleTimer:アクセサが呼び出され、パラメータが保持されます。

+0

この場合、私は[idleTimerTemp release]を呼び出さないという正しいアプローチですか?それは一般的な慣習ですか? – SkyEagle888

+0

この場合、あなたのクラスの '-dealloc'メソッドで' idleTimer'をリリースするでしょう。 –

2

アクセサーを使用する代わりにidleTimer ivarに直接割り当てます。

self.idleTimer = idleTimerTemp; 

プロパティアクセサは、使用しない場合に指定したセマンティクスを実装できません。

+1

このように考えてみましょう。 'self.idletimer = X'は' [self setIdleTimer:X] '(型チェック付き)の省略形です。 – titaniumdecoy

関連する問題