引言

定時(shí)器:A timer waits until a certain time interval has elapsed and then fires, sending a specified message to a target object.
翻譯如下:在固定的時(shí)間間隔被觸發(fā),然后給指定目標(biāo)發(fā)送消息??偨Y(jié)為三要素吧:時(shí)間間隔、被觸發(fā)、發(fā)送消息(執(zhí)行方法)

按照官方的描述,我們也確實(shí)是這么用的;但是里面有很多細(xì)節(jié),你是否了解呢?

  • 它會(huì)被添加到runloop,否則不會(huì)運(yùn)行,當(dāng)然添加的runloop不存在也不會(huì)運(yùn)行;

  • 還要指定添加到的runloop的哪個(gè)模式,而且還可以指定添加到runloop的多個(gè)模式,模式不對(duì)也是不會(huì)運(yùn)行的

  • runloop會(huì)對(duì)timer有強(qiáng)引用,timer會(huì)對(duì)目標(biāo)對(duì)象進(jìn)行強(qiáng)引用(是否隱約的感覺到坑了。。。)

  • timer的執(zhí)行時(shí)間并不準(zhǔn)確,系統(tǒng)繁忙的話,還會(huì)被跳過去

  • invalidate調(diào)用后,timer停止運(yùn)行后,就一定能從runloop中消除嗎,資源????

呵呵。。。下面會(huì)解決這些問題

定時(shí)器的一般用法

控制器中添加定時(shí)器,例如:

- (void)viewDidLoad {    NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:1 target:self selector:@selector(timerFire) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];    self.timer = timer;
}

- (void)timerFire {    NSLog(@"timer fire");
}

上面的代碼就是我們使用定時(shí)器最常用的方式,可以總結(jié)為2個(gè)步驟:創(chuàng)建,添加到runloop

系統(tǒng)提供了8個(gè)創(chuàng)建方法,6個(gè)類創(chuàng)建方法,2個(gè)實(shí)例初始化方法。

  • 有三個(gè)方法直接將timer添加到了

    網(wǎng)友評(píng)論