2010-03-19 108 views
2

我用儀器跟蹤了內存泄漏。我總是以負責任的圖書館爲基礎的信息結束。當我跟蹤下來在我的代碼,我會在這裏結束,但有沒有錯與我的內存管理:是否存在NSCFTimer內存泄漏?

- (void)setupTimer { 
    // stop timer if still there 
    [self stopAnimationTimer]; 

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(step:) userInfo:nil repeats:YES]; 

    self.animationTimer = timer; // retain property, -release in -dealloc method 
} 

財產animationTimer被保留計時器。在-dealloc我發佈它。

現在看起來像一個框架錯誤?我使用iPhone OS 3.0和3.1進行了檢查,每當我使用NSTimer時都會遇到這個問題。任何想法還有什麼可能是問題?

(我的內存泄漏掃描時間間隔爲0.1秒。但是,擁有5秒同樣的事情)

+0

'stopAnimationTimer'做什麼?我認爲你需要使計時器無效(並且我希望你在'stopAnimationTimer'方法中做到這一點)。 – bddckr 2010-03-19 21:40:35

+0

是的,它只是使計時器無效並將屬性設置爲零。 – dontWatchMyProfile 2010-03-19 22:17:15

回答

3

除非你stopAnimationTimer方法是invalidate「荷蘭國際集團和release‘荷蘭國際集團(然後設置爲nil)您animationTimer財產,你’重新泄漏記憶。

+0

你的意思是'釋放'而不是'dealloc''ing,不是嗎? – bddckr 2010-03-19 21:52:07

+0

...糟糕!是! :) – 2010-03-19 22:46:38

5

請勿撥打-[NSTimer dealloc]。永遠。

在這種情況下,-scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:-invalidate進行平衡。您不需要在定時器對象上調用-dealloc-release

+1

+1應該是對的,如果'invalidate'確實'釋放'計時器。因爲他使用'self.animationTimer = timer;'這將首先釋放舊的,然後保留新的值,因此這應該是泄漏安全的。 – bddckr 2010-03-19 21:58:48

1

我發現它:我有一個強烈的參考我的計時器。運行循環保留它。所以RC是2.但是因爲Timer對目標有很強的參考(在我的例子中保留了這個定時器),所以我有一個死鎖的情況。 -dealloc永遠不會被調用,因此我的計時器從來沒有被釋放過。 WTF。