2011-01-28 167 views
3

默認情況下,通過方法alloccopy返回的對象的retain count等於1,因此您必須自行釋放它。NSTimer內存管理問題

但通過的NSTimer示例代碼

 
// in one method start the timer (which myTimer is an Class Instance) 
myTimer = [NSTimer scheduledTimerWithTimeInterval:1 
        target:self selector:@selector(method:) 
        userInfo:nil repeats:YES]; 

// in another method 
[myTimer invalidate]; 
myTimer = nil; 

我的問題是,爲什麼[的NSTimer血清膽鹼酯酶**]返回一個對象,你不必挽留,但你可以在任何地方訪問它。你不需要釋放它,只需要調用invalidate就可以了。

回答

4

實例保留在它分配給的運行循環中。 保留計數保持在零以上直到運行循環釋放它。 所以你可以訪問對象,直到發生這種情況。

NSTimer docs

定時器與運行 環路一起工作。要有效地使用計時器,您應該知道 運行循環的運行方式 - 請參閱NSRunLoop和Threading 編程指南。特別注意 運行循環會保留它們的定時器,因此 可以在您將 添加到運行循環後釋放定時器。

然後具體地說:

使用 scheduledTimerWithTimeInterval:調用:重複: 或 scheduledTimerWithTimeInterval:目標:選擇器:USERINFO:重複: 類方法來創建計時器和 時間表它上當前運行循環的默認模式爲 。

所以你使用的方法自動處理當前的運行循環。