前言
在開發(fā)中我們經(jīng)常會(huì)遇到使用計(jì)時(shí)器的情況,例如圖片輪播,進(jìn)度條的繪制等就是比較常見的應(yīng)用場景.
常用的計(jì)時(shí)器有CADisplayLink
和NSTimer
,這一章我們來講解下CADisplayLink
的具體用法和注意事項(xiàng),NSTimer
的會(huì)在之后的文章進(jìn)行說明,想了解更多就點(diǎn)關(guān)注吧~~
CADisplayLink
概括
CADisplayLink
是用于同步屏幕刷新頻率的計(jì)時(shí)器.下面會(huì)對CADisplayLink
的用法進(jìn)行介紹,除外,還會(huì)對CADisplayLink
的擴(kuò)展用法進(jìn)行說明,繼續(xù)看下去,相信你會(huì)有所收獲.
CADisplayLink
使用方法
初始化
通過+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel
初始化link
對象
添加到runloop
如果想開啟link
需要把link
加入到runloop
中: - (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode
.除非計(jì)時(shí)器被停止,否則每次屏幕刷新時(shí),計(jì)時(shí)器的方法都會(huì)被觸發(fā).
每個(gè)計(jì)時(shí)器對象只能加入到一個(gè)runloop
中,但是可以被添加到不同的模式中,當(dāng)CADisplayLink
被加入到runloop
時(shí),會(huì)被runloop
隱式retain.如果想從所有的模式中移除計(jì)時(shí)器,需要執(zhí)行-invalidate()
方法.
從runloop中移除
移除計(jì)時(shí)器有兩個(gè)方法:- (void)removeFromRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode
和- (void)invalidate
.
我們來分析一下他們的異同
- removeFromRunLoop: forMode:
會(huì)將接收者從給定的模式中移除,這個(gè)方法會(huì)對計(jì)時(shí)器進(jìn)行隱式的release
.在調(diào)用removeFromRunloop方法,需要做判斷,如果當(dāng)期計(jì)時(shí)器不在runloop的話,會(huì)出現(xiàn)野指針的crash.出現(xiàn)crash的原因是runloop
多次調(diào)用了release
方法,進(jìn)行了over-release
.
- (void)invalidate
是從runloop
所有模式中移除計(jì)時(shí)器,并取消計(jì)時(shí)器和target的關(guān)聯(lián)關(guān)系.多次調(diào)用這個(gè)方法,不會(huì)出現(xiàn)crash.
CADisplayLink
的擴(kuò)展用法
通過對CADisplayLink
的屬性分析和講解,來闡述計(jì)時(shí)器的擴(kuò)展用法.
時(shí)間戳
時(shí)間戳timestamp
,這個(gè)屬性用來返回上一次屏幕刷新的時(shí)間戳.如果視頻播放的應(yīng)用,可以通過時(shí)間戳來獲取上一幀的具體時(shí)間,來計(jì)算下一幀.
間隔時(shí)間
duration
屬性用于提供屏幕最大刷新頻率(maximumFramesPerSecond
)下每一幀的時(shí)間間隔.這個(gè)屬性可以用于在應(yīng)用中獲取幀率.
暫停和開啟
isPaused
設(shè)置為true
時(shí)可以用于暫停通知.
修改幀率
修改幀率 : 如果在特定幀率內(nèi)無法提供對象的操作,可以通過降低幀率解決.一個(gè)擁有持續(xù)穩(wěn)定但是較慢幀率的應(yīng)用要比跳幀的應(yīng)用順滑的多.
可以通過preferredFramesPerSecond
來設(shè)置每秒刷新次數(shù).preferredFramesPerSecond
默認(rèn)值為屏幕最大幀率(maximumFramesPerSecond
),目前是60.
實(shí)際的屏幕幀率會(huì)和preferredFramesPerSecond
有一定的出入,結(jié)果是由設(shè)置的值和屏幕最大幀率(maximumFramesPerSecond
)相互影響產(chǎn)生的.規(guī)則大概如下:
如果屏幕最大幀率(preferredFramesPerSecond
)是60,實(shí)際幀率只能是15, 20, 30, 60中的一種.如果設(shè)置大于60的值,屏幕實(shí)際幀率為60.如果設(shè)置的是26~35之間的值,實(shí)際幀率是30.如果設(shè)置為0,會(huì)使用最高幀率.
需要注意CADisplayLink
是不能被繼承的.