正常來講,我們開啟乙個timer有幾種辦法,
1. 直接使用
+ (nstimer *)scheduledtimerwithtimeinterval:(nstimeinterval)ti target:(id)atarget selector:(sel)aselector userinfo:(id)userinfo repeats:(bool)yesorno;
這個不用關心runloop的事情,也不用關心mode,預設新增到當前runloop的預設mode
2. 首先建立timer 然後新增到runloop裡面。
+ (nstimer *)timerwithtimeinterval:(nstimeinterval)ti
target:(id)target
selector:(sel)aselector
userinfo:(id)userinfo
repeats:(bool)repeats
這裡的新增的runloop裡面還要選擇mode,所以注意可能會阻塞runloop裡面的相同mode下的其他程序(比如滾動tableview,timer暫停)。這是個坑。需要注意。
記憶體洩露
記憶體洩露的原因是timer不停止,則會一直保有乙份target(比如self),
. this means that as long as a timer remains valid, its target will not be deallocated
停止timer,並且置為nil,不過這樣再pop回來timer就沒了,就要重新啟動timer,如果也有倒計時的話,計數就不對了。比較經濟實惠的方法是用block解決。大概想法就是讓nstimer 類做為target,解決記憶體無法釋放的問題。
@inte***ce nstimer (xxblockssupport)
+ (nstimer *)xx_scheduledtimerwithtimeinterval:(nstimeinterval)interval
block:(void(^)())block
repeats:(bool)repeats;
@end
@implementation nstimer (xxblockssupport)
+ (nstimer *)xx_scheduledtimerwithtimeinterval:(nstimeinterval)interval
block:(void(^)())block
repeats:(bool)repeats
+ (void)xx_blockinvoke:(nstimer *)timer
} @end
注意:以上nstimer的target是nstimer類物件,類物件本身是個單利,此處雖然也是迴圈引用,但是由於類物件不需要**,所以沒有問題。但是這種方式要注意block的間接迴圈引用,當然了,解決block的間接迴圈引用很簡單,定義乙個weak變數,在block中使用weak變數即可。
記憶體洩露問題
下面是乙個影象去霧的程式,主函式簡略如下,看一下下面的 有何問題。int main cvreleasecapture capture cvdestroywindow result return 0 大致說一下一些fast dahaze是乙個去霧類,負責影象處理,儲存等。程式看起來很簡單,主迴圈裡面做...
記憶體洩露問題
記憶體洩露是vc中自我認為比較難於解決的問題之一 至少現在解決起來很麻煩了 今天用boundschecker除錯了一下原來自己寫的程式,呵呵!居然提示記憶體洩露40位元組。看到了洩露的 的位置,一處new的地方,由於程式寫過很長時間了,所以想不起來了,乾脆模擬一下吧!程式中第一了乙個結構體,用於儲存...
C 記憶體洩露的問題
遇到乙個很頭疼的記憶體洩露的問題,除錯的大半天才發現的,指標指向的物件1被delete了兩次,而在vs2005中,debug中斷的位置不是這個被多次delete的物件1,而是另外乙個物件2,在釋放它的時候,提示訪問了未知的堆疊。雖然沒有在記憶體中仔細進行除錯,不過可以揣測出問題原因是,在多次釋放物件...