iOS開(kāi)發(fā):NSTimer,計(jì)時(shí)器的使用

原文來(lái)自:?https://blog.csdn.net/CC1991_/article/details/81070986

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

? ? ? ? 1、初始化計(jì)時(shí)器

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

?? ?+ (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方式初始化的,需要手動(dòng)addTimer:forMode: 將timer添加到一個(gè)runloop中;而有scheduled的初始化方法將可以默認(rèn)mode直接添加到當(dāng)前的runloop中。

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

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

?? ?方法一:

?? ?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]; //初始化一個(gè)5分鐘執(zhí)行一次的計(jì)時(shí)器

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

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

? ? ? ? 二、計(jì)時(shí)器觸發(fā)操作

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

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

? ? ? ? ?三、計(jì)時(shí)器停止操作

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

? ? ? ? ?[self.timer invalidate]; //停止計(jì)時(shí)器的方法

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

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

?? ?四、使用計(jì)時(shí)器需要注意的地方

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

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

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

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容