nstimer在ios開發中會經常用到,尤其是小型遊戲,然而對於初學者時常會注意不到其中的記憶體釋放問題,將其基本用法總結如下:
一、初始化方法:有五種初始化方法,分別是
+ (nstimer *)timerwithtimeinterval:(nstimeinterval)ti invocation:(nsinvocation *)invocation repeats:(bool)yesorno;
- (void)viewdidload
+ (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、引數repeats是指定是否迴圈執行,yes將迴圈,no將只執行一次。 2、
timerwithtimeinterval這兩個類方法建立出來的物件如果不用 addtimer: formode方法手動加入主迴圈池中,將不會迴圈執行。並且如果不手動呼叫fair,則定時器不會啟動。
3、scheduledtimerwithtimeinterval這兩個方法不需要手動呼叫fair,會自動執行,並且自動加入主迴圈池。
4、init方法需要手動加入迴圈池,它會在設定的啟動時間啟動。
二、成員變數
@property (copy) nsdate *firedate;
這是設定定時器的啟動時間,常用來管理定時器的啟動與停止
//啟動定時器
timer.firedate = [nsdate distantpast];
//停止定時器
timer.firedate = [nsdate distantfuture];
@property (readonly) nstimeinterval timeinterval;
這個是乙個唯讀屬性,獲取定時器呼叫間隔時間。
@property nstimeinterval tolerance;
這是7.0之後新增的乙個屬性,因為nstimer並不完全精準,通過這個值設定誤差範圍。
@property (readonly, getter=isvalid) bool valid;
獲取定時器是否有效
@property (readonly, retain) id userinfo;
獲取引數資訊
三、關於記憶體釋放
如果我們啟動了乙個定時器,在某個介面釋放前,將這個定時器停止,甚至置為nil,都不能是這個介面釋放,原因是系統的迴圈池中還保有這個物件。所以我們需要這樣做:
-(void)dealloc
- (void)viewdidload
-(void)btn
timer=nil;
[self dismissviewcontrolleranimated:yes completion:nil];
}
在官方文件中我們可以看到
[timer invalidate]是唯一的方法將定時器從迴圈池中移除。
IOS中定時器NSTimer
呼叫一次計時器方法 cpp view plain copy mytimer nstimer scheduledtimerwithtimeinterval 1.5 target self selector selector scrolltimer userinfo nil repeats no 不重複...
IOS開發中NSTimer定時器的使用
第一步 呼叫函式 self getcirclebackground self.blcview.btchartview.mcircleview getcurrentlb self.blcview.btchartview.mcurrent 第二步 方法的實現 void getcirclebackgrou...
iOS中定時器NSTimer使用
呼叫一次計時器方法 cpp view plain copy mytimer nstimer scheduledtimerwithtimeinterval 1.5 target self selector selector scrolltimer userinfo nil repeats no 不重複...