2014-02-28 53 views
0

說我有一個視圖控制器。帶ARC的NSTimers壽命

在我的視圖控制器,我計劃從一些其他類調用每9秒方法:

redTimer=[NSTimer scheduledTimerWithTimeInterval:9 target:appDelegate.koule selector:@selector(fbWander) userInfo:nil repeats:YES]; 

我有這幾個問題。

如果我沒有將實例變量redTimer分配給返回的NSTimer,該怎麼辦?會發生什麼?該方法會每9秒鐘被調用一次嗎?

現在,由於我已將紅色定時器分配給定時器,如果redTimer被分配了不同的定時器(因此沒有任何東西會指向我的原始定時器了)會發生什麼情況,定時器是否會死亡並停止重複?

如果我將它分配給redTimer,然後我的視圖控制器被銷燬,該怎麼辦?每隔9秒會停止一次該方法嗎?

在這些情況下,計時器及其動作會發生什麼?

感謝

回答

2

弧,需要有人在任何時候都很強的參考對象或它得到釋放和回收。

在scheduledTimerWithTimeInterval:target:selector:userInfo:repeatats的情況下,計時器被創建並立即添加到當前運行循環中。 runloop保留它。如果重複設置爲YES,則定時器保持活動狀態。如果定時器設置爲重複=否,它將保持活動狀態,直到完成觸發(直到定時器的選擇器完成執行)。一旦發生這種情況,runloop發佈它,它的保留計數降爲零,並且它被釋放。

如果定時器重複,那麼它將被runloop保留,直到你使其失效。然後它被釋放。

如果將計時器保存爲強實例變量,則該實例變量也會保持強引用,因此計時器的引用計數器不會降至零,直到您清除強引用爲止。

+0

對於使用scheduledTimerWithTimeInterval創建的重複計時器...我傾向於將它們設置爲弱實例變量(或屬性)。然後,當我想停止定時器時,我只是使用像'[myTimer invalidate];'的代碼。這會導致runloop釋放計時器。它被取消分配,然後系統將我的弱引用歸零。如果我然後嘗試向計時器發送第二個無效消息,則弱iVar現在爲零,因此該呼叫不會執行任何操作。這意味着我不需要同時使計時器無效並將其設置爲零,並且我可以發送無效計時器以確保計時器正在運行。 –