iOS開發(fā):NSTimer,計時器的使用

原文來自:?https://blog.csdn.net/CC1991_/article/details/81070986

一、NSTimer的初始化創(chuàng)建

? ? ? ? 1、初始化計時器

?? ?(1)官方API的兩個方法:

?? ?+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

?? ?+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

? ? ? ? 注意:不用scheduled方式初始化的,需要手動addTimer:forMode: 將timer添加到一個runloop中;而有scheduled的初始化方法將可以默認(rèn)mode直接添加到當(dāng)前的runloop中。

?? ?(2)具體實例如下所示:

?? ?@property (nonatomic, strong) NSTimer *timer; //聲明計時器屬性

?? ?方法一:

?? ?self.timer = [NSTimer timerWithTimeInterval:5*60 target:self selector:@selector(printNum) userInfo:nil repeats:YES];

? ?? ?[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];

?? ?方法二:

?? ?self.timer = [NSTimer scheduledTimerWithTimeInterval:5*60 target:self selector:@selector(printNum) userInfo:nil repeats:YES]; //初始化一個5分鐘執(zhí)行一次的計時器

tableView滑動時,加入?[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];,不然,計時器會出現(xiàn)卡頓等其他現(xiàn)象

?NSTimer初始化方法一,里面沒有scheduled,所以必須要手動addTimer:,將timer添加到runloop中;方法二中有scheduled的初始化方法,將以默認(rèn)的mode把timer添加到當(dāng)前的runloop中。

? ? ? ? 二、計時器觸發(fā)操作

? ? ? ? 當(dāng)定時器創(chuàng)建完(不用scheduled的)添加到runloop中后,該定時器將在初始化時指定的timeInterval秒后自動觸發(fā),可以使用-(void)fire;方法來立即觸發(fā)該定時器。

? ? ? ?在重復(fù)執(zhí)行的定時器中調(diào)用這個方法后會立即觸發(fā)該定時器,但不會中斷其之前的執(zhí)行計劃。在不重復(fù)執(zhí)行的定時器中調(diào)用此方法,立即觸發(fā)后,就會使這個定時器失效。

? ? ? ? ?三、計時器停止操作

? ? ? ? ?NSTimer的停止操作只有一種方法可以將timer移除runloop,具體操作如下所示:

? ? ? ? ?[self.timer invalidate]; //停止計時器的方法

? ? ? ? ?self.timer = nil; ? //為了防止意外,還是要把它賦值為nil的

? ? ? ?由于計時器NSTimer會保留目標(biāo)對象,等到它自身失效時再釋放這個對象。調(diào)用invalidate方法可令計時器失效;執(zhí)行完相關(guān)任務(wù)后,一次性的計時器也會失效。如果將計時器設(shè)置成重復(fù)執(zhí)行的模式,那么必須要自己手動調(diào)用invalidate方法,才能令其停止。但是由于計時器會保留它的目標(biāo)對象,所以反復(fù)執(zhí)行任務(wù)會導(dǎo)致程序出問題,也就是說設(shè)置成重復(fù)執(zhí)行模式的那種計時器,容易形成“引用循環(huán)”,因此在這種情況下,一定要記得調(diào)用終止計時器的invalidate方法才行。

?? ?四、使用計時器需要注意的地方

?? ?1、倒計時的時間間隔(時間單位是秒,可以精確到50-100毫秒);

?? ?2、指定的執(zhí)行方法;

?? ?3、實現(xiàn)指定執(zhí)行方法的對象;

?? ?4、是否重復(fù)執(zhí)行;

?? ?5、使用方法" invalidate "進(jìn)行停止;

?? ?6、將對象設(shè)置為" nil “;

?? ?7、特別是在返回到其他視圖控制器的時候,要在" - (void)viewWillDisappear:

?????(BOOL)animated "方法中(特別注意:不能在" - (void)dealloc”方法中設(shè)置)將timer停止,并設(shè)置為nil。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 定時器的用法 系統(tǒng)提供了8個創(chuàng)建方法,6個類創(chuàng)建方法,2個實例初始化方法。有三個方法直接將timer添加到...
    gpylove閱讀 1,891評論 1 3
  • iOS中計時器常用的有兩種方式 使用NSTimer類(Swift 中更名為 Timer) NSTimer 常用的初...
    superDg閱讀 1,941評論 0 1
  • NSTimer 是系統(tǒng)提供的定時器,系統(tǒng)提供的api也比較簡單,使用很方便,項目開發(fā)中會經(jīng)常用到。然而,在使用NS...
    戀空K閱讀 4,151評論 0 13
  • 這篇文章主要整理一下面試中會問到的一個知識點:幾種計時器的知識點(一)NSTimer1.什么是NSTimer?官方...
    329fd8af610c閱讀 1,499評論 0 0
  • 再一次面試中被問到nstimer的爭取使用方法,原理,我當(dāng)時就說了[_timer invalidate],time...
    iOS開發(fā)小平哥閱讀 4,194評論 1 13

友情鏈接更多精彩內(nèi)容