NSTimer使用注意事項

##NSTimer使用注意事項

http://www.cnblogs.com/qmmq/p/5282982.html
1.scheduled開頭和非schedule的開頭方法的區(qū)別。系統(tǒng)框架提供了幾種創(chuàng)建NSTimer的方法,其中以scheduled開頭的方法會自動把timer加入當前run loop,到了設(shè)定的時間點就會觸發(fā)指定的方法,而沒有scheduled開頭的方法則需要程序員自己手動添加到timer到一個run loop中才會有效。run loop在運行時一般有兩個mode,一個defaultmode,一個trackingmode,正常情況下run loop使用defaultmode,scheduled生成的timer會默認添加到defaultmode中,當我們互動scrollview時,run loop切換到trackingmode運行,于是我們發(fā)現(xiàn)定時器失效了。為了使定時器在我們滑動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參數(shù)的強引用。只有當調(diào)取了NSTimer的invalidate方法時,NSTimer才會釋放target和userInfo。生成timer的方法中如果repeats參數(shù)為NO,則定時器觸發(fā)后會自動調(diào)取invalidate方法。如果repeats參數(shù)為YES,則需要程序員手動調(diào)取invalidate方法才能釋放timer對target和userIfo的強引用。

3.在使用repeats參數(shù)為YES的定時器時,如果在使用完定時器時后沒有調(diào)取invalidate方法,導(dǎo)致target和userInfo沒有被釋放,則可能會形成循環(huán)引用情況,從而影響內(nèi)存釋放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容