iOS NSTimer 定時(shí)器用法總結(jié)

NSTimer在IOS開(kāi)發(fā)中會(huì)經(jīng)常用到,尤其是小型游戲撤蟆,然而對(duì)于初學(xué)者時(shí)常會(huì)注意不到其中的內(nèi)存釋放問(wèn)題,將其基本用法總結(jié)如下:

一、初始化方法:有五種初始化方法斑响,分別是

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

- (void)viewDidLoad {

[super viewDidLoad];

//初始化一個(gè)Invocation對(duì)象

NSInvocation * invo = [NSInvocation invocationWithMethodSignature:[[self class] instanceMethodSignatureForSelector:@selector(init)]];

[invo setTarget:self];

[invo setSelector:@selector(myLog)];

NSTimer * timer = [NSTimer timerWithTimeInterval:1 invocation:invo repeats:YES];

//加入主循環(huán)池中

[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];

//開(kāi)始循環(huán)

[timer fire];

}

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 invocation:invo repeats:YES];

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

NSTimer * timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(myLog) userInfo:nil repeats:NO]

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(myLog:) userInfo:@"123" repeats:YES]

- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(id)ui repeats:(BOOL)rep

NSTimer * timer = [[NSTimer alloc]initWithFireDate:[NSDate distantPast] interval:1 target:self selector:@selector(myLog:) userInfo:nil repeats:YES];

[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];

注意:這五種初始化方法的異同:

1、參數(shù)repeats是指定是否循環(huán)執(zhí)行钳榨,YES將循環(huán)舰罚,NO將只執(zhí)行一次。

2薛耻、timerWithTimeInterval這兩個(gè)類方法創(chuàng)建出來(lái)的對(duì)象如果不用 addTimer: forMode方法手動(dòng)加入主循環(huán)池中营罢,將不會(huì)循環(huán)執(zhí)行。并且如果不手動(dòng)調(diào)用fair昭卓,則定時(shí)器不會(huì)啟動(dòng)。

3瘟滨、scheduledTimerWithTimeInterval這兩個(gè)方法不需要手動(dòng)調(diào)用fair候醒,會(huì)自動(dòng)執(zhí)行,并且自動(dòng)加入主循環(huán)池杂瘸。

4倒淫、init方法需要手動(dòng)加入循環(huán)池,它會(huì)在設(shè)定的啟動(dòng)時(shí)間啟動(dòng)败玉。

二敌土、成員變量

@property (copy) NSDate *fireDate;

這是設(shè)置定時(shí)器的啟動(dòng)時(shí)間,常用來(lái)管理定時(shí)器的啟動(dòng)與停止

//啟動(dòng)定時(shí)器

timer.fireDate = [NSDate distantPast];

//停止定時(shí)器

timer.fireDate = [NSDate distantFuture];

@property (readonly) NSTimeInterval timeInterval;

這個(gè)是一個(gè)只讀屬性运翼,獲取定時(shí)器調(diào)用間隔時(shí)間返干。

@property NSTimeInterval tolerance;

這是7.0之后新增的一個(gè)屬性,因?yàn)镹STimer并不完全精準(zhǔn)血淌,通過(guò)這個(gè)值設(shè)置誤差范圍矩欠。

@property (readonly, getter=isValid) BOOL valid;

獲取定時(shí)器是否有效

@property (readonly, retain) id userInfo;

獲取參數(shù)信息

三财剖、關(guān)于內(nèi)存釋放

如果我們啟動(dòng)了一個(gè)定時(shí)器,在某個(gè)界面釋放前癌淮,將這個(gè)定時(shí)器停止躺坟,甚至置為nil,都不能是這個(gè)界面釋放乳蓄,原因是系統(tǒng)的循環(huán)池中還保有這個(gè)對(duì)象咪橙。所以我們需要這樣做:

-(void)dealloc{

NSLog(@"dealloc:%@",[self class]);

}

- (void)viewDidLoad {

[super viewDidLoad];

timer= [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(myLog:) userInfo:nil repeats:YES];

UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];

btn.backgroundColor=[UIColor redColor];

[btn addTarget:self action:@selector(btn) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:btn];

}

-(void)btn{

if (timer.isValid) {

[timer invalidate];

}

timer=nil;

[self dismissViewControllerAnimated:YES completion:nil];

}

在官方文檔中我們可以看到 [timer invalidate]是唯一的方法將定時(shí)器從循環(huán)池中移除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虚倒,一起剝皮案震驚了整個(gè)濱河市美侦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裹刮,老刑警劉巖音榜,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捧弃,居然都是意外死亡赠叼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)违霞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘴办,“玉大人,你說(shuō)我怎么就攤上這事买鸽〗Ы迹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵眼五,是天一觀的道長(zhǎng)妆艘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)看幼,這世上最難降的妖魔是什么批旺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮诵姜,結(jié)果婚禮上汽煮,老公的妹妹穿的比我還像新娘。我一直安慰自己棚唆,他們只是感情好暇赤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著宵凌,像睡著了一般鞋囊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞎惫,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天失暴,我揣著相機(jī)與錄音坯门,去河邊找鬼。 笑死逗扒,一個(gè)胖子當(dāng)著我的面吹牛古戴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矩肩,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼现恼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了黍檩?” 一聲冷哼從身側(cè)響起叉袍,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刽酱,沒(méi)想到半個(gè)月后喳逛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棵里,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年润文,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殿怜。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡典蝌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出头谜,到底是詐尸還是另有隱情骏掀,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布柱告,位于F島的核電站截驮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏际度。R本人自食惡果不足惜葵袭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甲脏。 院中可真熱鬧眶熬,春花似錦妹笆、人聲如沸块请。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)墩新。三九已至,卻和暖如春窟坐,著一層夾襖步出監(jiān)牢的瞬間海渊,已是汗流浹背绵疲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臣疑,地道東北人盔憨。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像讯沈,于是被迫代替她去往敵國(guó)和親郁岩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容