NSTimer 是一個常用的物件,用來處理定期持續執行的事情。比方說倒數計時器。
NSTimer 使用上要特別注意它的生命周期 以免還沒執行,Timer 就消失了,或 ViewController 都 Dismiss 了,它還在計它的數。
首先,我們通常會建立三個東西來完成 NSTimer 的工作
1. 宣告全域變數
2. 建立相對應的 method
3. 建立 Timer
宣告全域變的的目的,是為了在建立Timer 後,不因 method 執行結束後消失這個變數。
範例如下:
首先,依 Hello World 的文件做法,建立一個簡單程式,有一個 UILabel 和 Button,也完成了IBAction 與 IBOutlet 的建立,接下來就是主程式
我們在第 12 行建立了一個全域的 NSTimer 叫 timer,
接下來在 IBAction 中(22行起)設定,如果 counter isValid (正在執行中),就使用 invalidate 這個 method 中斷它,
否則就用
scheduledTimerWithTimeInterval:target:selfselector:userInfo:repeats:
方法來建立 NSTimer
首先第一個參數是多久執行一次,案例中是 0.1 秒,再來是目標,就是傳送訊息的對像,本案中是 self,再來是selector,也就是要執行的 method 名稱, 案例中為 @selector(addNumber:) ,最後是使用資訊與是否重覆執行,如果重覆執行,就會不停的執行,直到被 invalidate 為止。
另外要特別注意的是,NSTimer 如果你開了 repeats, ARC 就不會主動放掉記憶體,所以在離開一個 view Controller 之前,一定要手動 invalidate 所有的 NSTimer,不然來回幾次就會吃光你的記憶體了。

大大你好 這裡想請問幾個問題 關於這一點 =>宣告全域變的的目的,是為了在建立Timer 後,不因 method 執行結束後消失這個變數。 這裡想請問一下 如果是為了 invalidate 該物件 是可以從 NSTimer 所執行的的方法 所傳入的NSTimer物件 來作處理的 (以大大你的範例來說 就是addNumber:這一個方法) 由於我是新手 所以煩請大大教導 為何 不使用占記憶體較小的float參數 作為全域宣告呢? 這邊貼上程式碼 #import "ViewController.h" @interface ViewController () @end @implementation ViewController { float value; } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"s"); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void) changeValue: (id) sender{ [_progress setProgress:value animated:YES]; value += 0.099; if (value >= 0.99) { [sender invalidate]; } } - (IBAction)click:(id)sender { value = 0.0f; [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeValue:) userInfo:nil repeats:YES]; } @end //這邊使用了Progress View UI物件作為輸出
因為我可能還有別的 method 對這個 NSTimer 做調整,如中碼表程式要暫停等等功能。
請問如果沒有 timer invalidate 和 timer nil的話,是不是即使ViewController dismiss掉了,下次ViewController再被present的話就會繼續執行?