創(chuàng)建一個NSTimer驰凛,有多種方法孝情,如
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
timerWithTimeInterval:target:selector:userInfo:repeats:
等等
其中,用不帶有scheduled
的洒嗤,在初始化了后箫荡,還需要調(diào)用
addTimer:forMode:
方法,將Timer加入到runloop中渔隶。
參數(shù):
-
seconds
定時時間 -
target
發(fā)送對象 -
aSelector
定時器啟動調(diào)用的方法 -
userInfo
可為nil羔挡,使用者的信息 -
repeats
定時器是否循環(huán)
在Timer添加到runloop后洁奈,定時器立刻啟動,在seconds時間后绞灼,調(diào)用aSelector
方法利术,如果最開始時不想等seconds時間,可調(diào)用-fire方法低矮,立刻調(diào)用aSelector
方法印叁。
-invalidate
方法可使定時器失效。
注意:
- 使用
-invalidate
方法后军掂,即使再次使用-fire方法也不會讓定時器再次工作轮蜕,因為-invalidate
方法是使Timer失效。 - 暫停定時器:可使用
[self setFireDate:[NSDate distantFuture]];
方法:即將定時器啟動時間設(shè)為無窮遠
恢復(fù)定時器蝗锥,使用[self setFireDate:[NSDate date]];
方法:即將定時器啟動時間設(shè)為現(xiàn)在的時刻跃洛。 - 對于需要在暫停時刻改變定時時間間隔的情況,則需要重新創(chuàng)建NSTImer终议,啟動汇竭,通過-invalidate停止定時器。
NSTimer 內(nèi)存泄漏解決方法
由于 NSTimer
容易與持有它的對象互相引用穴张,從而導(dǎo)致內(nèi)存泄漏细燎,因此在使用時需要格外注意。 iOS 10.0 以后已經(jīng)有了 scheduledTimer(withTimeInterval:repeats:block:)
方法解決內(nèi)存泄漏問題皂甘,但是 iOS 10.0 以前還需要自己想辦法玻驻。
- 如果
timerWithTimeInterval:target:selector:userInfo:repeats:
中傳給 target 的為weakSelf
是否可以?
不可以叮贩。因為 Timer 對 target 強引用击狮,強引用一個 weak 變量,對變量所指的對象仍然是強引用 - 借鑒參考 1 中第 52 條的方法解決該問題益老。
extension Timer {
class func njyScheduledTimer(timerInterval: TimeInterval, block: @escaping () -> Void, repeats: Bool) -> Timer {
return Timer.scheduledTimer(timeInterval: timerInterval, target: self, selector: #selector(njyBlockInvoke(timer:)), userInfo: [block copy], repeats: repeats)
}
@objc class func njyBlockInvoke(timer: Timer) {
let block = timer.userInfo as? () -> Void
if let block = block {
block()
}
}
}
注意:在實際使用時彪蓬,仍然要注意內(nèi)存泄漏的問題,因此需要使用 weak var weakSelf = self
和 let strongSelf = weakSelf
打破保留環(huán)捺萌,解決內(nèi)存泄漏的問題档冬。