NSTimer 的記憶體洩露問題

2021-07-13 10:08:30 字數 1536 閱讀 2259

正常來講,我們開啟乙個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,在釋放它的時候,提示訪問了未知的堆疊。雖然沒有在記憶體中仔細進行除錯,不過可以揣測出問題原因是,在多次釋放物件...