NSTimer使用注意事項

1.

scheduled開頭和非schedule的開頭方法的區別。系統框架提供了幾種創建NSTimer的方法,其中以scheduled開頭的方法會自動把timer加入當前run loop,到了設定的時間點就會觸發指定的方法,而沒有scheduled開頭的方法則需要程序員自己手動添加到timer到一個run loop中才會有效。run loop在運行時一般有兩個mode,一個defaultmode,一個trackingmode,正常情況下run loop使用defaultmode,scheduled生成的timer會默認添加到defaultmode中,當我們互動scrollview時,run loop切換到trackingmode運行,于是我們發現定時器失效了。為了使定時器在我們滑動scrollview時也能正常運行,我們需要確保defaultmode和trackingmode里都添加了我們生成的timer。如:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:_timeInterval target:self selector:@selector(addone) userInfo:nil repeats:YES];
 [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];

或者:

NSTimer *timer = [NSTimer timerWithTimeInterval:_timeInterval target:self selector:@selector(addone) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

2.

使用NSTimer時,timer會保持對target和userInfo參數的強引用。只有當調取了NSTimer的invalidate方法時,NSTimer才會釋放target和userInfo。生成timer的方法中如果repeats參數為NO,則定時器觸發后會自動調取invalidate方法。如果repeats參數為YES,則需要程序員手動調取invalidate方法才能釋放timer對target和userIfo的強引用。

3.

在使用repeats參數為YES的定時器時,如果在使用完定時器時后沒有調取invalidate方法,導致target和userInfo沒有被釋放,則可能會形成循環引用情況,從而影響內存釋放。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • NSTimer是ios上比較常用的定時器組件,在使用了一段時間后,發現有些地方是需要注意一下的。 NSTimer ...
    _Thinking_閱讀 988評論 2 9
  • NSTimer使用注意事項# 存在延遲## 不管是一次性的還是周期性的timer的實際觸發事件的時間,都會與所加入...
    趙奧勛閱讀 1,180評論 0 0
  • 一、performSelectorXXX之類的方法 1、performSelectorOnMainThread:w...
    朝雨晚風閱讀 1,492評論 0 6
  • 《能量祈禱誓言》 “門兒哥、博杰,數據還是有點低,你們還是先出去下,這個你們也不用聽”啾啾好似調取了數據后,對我們...
    天空之城正陽門閱讀 356評論 0 2
  • 過了幾年后,明月清清知道這個世界原來是一個魔法世界,自己的父親是擁有火屬性的持有者,有自己的核心水晶,核心水晶處于...
    冱寒閱讀 251評論 0 0