2011-10-23 66 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。根本沒有崩潰。

但我的變量被定義爲保留。哪裏不對 ?

+0

我使用XCODE 4.2與iOS5 – 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伊娃,而不是使用訪問器。請改爲:

self.idleTimer = idleTimerTemp; 

如果您不使用它們,則屬性訪問器無法實現您指定的語義。

+1

想想這樣:'self.idletimer = X'是'[self setIdleTimer:X]'的縮寫(帶有類型檢查)。 – titaniumdecoy