2010-03-19 135 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。