是什么?
@interface NSTimer : NSObject
在經(jīng)過(guò)一定時(shí)間間隔后觸發(fā)的計(jì)時(shí)器,可將指定的消息發(fā)送到目標(biāo)對(duì)象。
使用定時(shí)器
+scheduledTimerWithTimeInterval:taget:selector:userInfo:repeasts:
"ti" - 每隔多少秒,觸發(fā)計(jì)時(shí)器
"target" - 調(diào)用"哪個(gè)類"的方法。
"selector" - "什么方法"(也就是做什么事情). 如果傳參,傳遞的是計(jì)時(shí)器對(duì)象本身.
如: "timerFireMethod:"
- (void)timerFireMethod:(NSTimer *)timer
"userInfo" - 計(jì)時(shí)器的用戶信息.可以為 nil。
"repeats" - YES,重復(fù)調(diào)用,直到計(jì)時(shí)器銷毀。NO,計(jì)時(shí)器將在其觸發(fā)后失效。
返回新的"NSTimer對(duì)象"
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti
target:(id)aTarget
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)yesOrNo;
舉例 - 1
假設(shè): self 是 ViewController.
每隔"2秒"調(diào)用一次"當(dāng)前類的timerScroll方法",一直循環(huán)調(diào)用.
(在ViewController里面沒(méi)有找到timerScroll方法,則報(bào)錯(cuò))
[NSTimer scheduledTimerWithTimeInterval: 2.0 target:self selector: @selector(timerScroll) userInfo:nil repeats:YES];
-- 未找到"timerScroll"方法
reason: '-[ViewController timerScroll]: unrecognized selector sent to instance 0x7fc22bd4b1f0'
舉例 - 2
[NSTimer scheduledTimerWithTimeInterval: 2.0 target:self selector: @selector(timerScroll:) userInfo:@"用戶信息" repeats:NO];
-(void)timerScroll:(NSTimer *)timer{
NSLog(@"userInfo =%@, timer = %@",timer.userInfo,timer);
}
"效果如下:"
userInfo =用戶信息, timer = <__NSCFTimer: 0x600003f62d00>
"說(shuō)明: "
1. "userInfo" 就像發(fā)信息,那邊發(fā)什么信息,這里就接收什么信息.
2. "repeats:NO" 說(shuō)明"NSTimer"只運(yùn)行一次!
3. "timerScroll :" 傳遞的是"NSTimer"本身.
block - 方式使用NSTimer
+scheduledTimerWithTimeInterval: repeats:block:
"interval" - 時(shí)間間隔
"repeats" - 是否重復(fù)
"block" - 需要定時(shí)運(yùn)行的 "代碼"
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
repeats:(BOOL)repeats
block:(void (^)(NSTimer *timer))block;
舉例 - 1
"每隔2秒,調(diào)用timerScroll方法"
[NSTimer scheduledTimerWithTimeInterval:2.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
[self timerScroll];
}];
銷毀定時(shí)器
-(void)stopTimer{
[self.timer invalidate];
self.timer = nil; "strong修飾的Timer,需要將指針清空.避免出現(xiàn)野指針問(wèn)題"
}
NSTimer 使用strong修飾還是weak修飾呢? 為什么?
- 一般來(lái)說(shuō),OC對(duì)象用
strong來(lái)修飾.控件用weak來(lái)修飾. -
NSTimer是OC對(duì)象,應(yīng)該來(lái)說(shuō)是用strong修飾. - 但是,有這么一個(gè)情況:
NSTimer可以獨(dú)立的運(yùn)行.不需要self.timer = [NSTimer ....]來(lái)強(qiáng)指針指向.
如:[NSTimer scheduledTimerWithTimeInterval:2.0 ....]這樣寫,NSTimer照常工作.這說(shuō)明一直都有個(gè)強(qiáng)指針指向NSTimer.所以定時(shí)器不會(huì)被銷毀. - 所以根據(jù),能用
weak就不用strong的原則, NSTimer 最好使用weak來(lái)修飾. - 因?yàn)?code>weak修飾的對(duì)象一旦被銷毀,則全部銷毀. 不會(huì)有歷史遺留問(wèn)題而引的野指針.
- 用
weak來(lái)修飾NSTimer,上面示例中可以省去self.timer = nil;.