廣告贊助

NSTimer 是一個常用的物件,用來處理定期持續執行的事情。比方說倒數計時器。

NSTimer 使用上要特別注意它的生命周期 以免還沒執行,Timer 就消失了,或 ViewController 都 Dismiss 了,它還在計它的數。

 
 

首先,我們通常會建立三個東西來完成 NSTimer 的工作

 

1. 宣告全域變數
2. 建立相對應的 method
3. 建立 Timer 

宣告全域變的的目的,是為了在建立Timer 後,不因 method 執行結束後消失這個變數。
範例如下:

首先,依 Hello World 的文件做法,建立一個簡單程式,有一個 UILabel 和 Button,也完成了IBAction 與 IBOutlet 的建立,接下來就是主程式

螢幕快照 2012-11-19 下午4.07.10  
 

我們在第 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,不然來回幾次就會吃光你的記憶體了。 

 

 

文章標籤
創作者介紹

X Code Objective-C Swift 學習記錄 for iOS & macOS (OS X)

shenfive 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • 顏宏益
  • 大大你好 這裡想請問幾個問題 關於這一點
    =>宣告全域變的的目的,是為了在建立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 做調整,如中碼表程式要暫停等等功能。

    shenfive 於 2013/10/18 20:30 回覆

  • Stranger
  • 請問如果沒有 timer invalidate 和 timer nil的話,是不是即使ViewController dismiss掉了,下次ViewController再被present的話就會繼續執行?