【问题标题】:Is there an NSCFTimer memory leak?是否存在 NSCFTimer 内存泄漏?
【发布时间】:2011-01-29 15:46:43
【问题描述】:

我用仪器找到了内存泄漏。我总是得到负责任的图书馆是基金会的信息。当我在我的代码中追踪它时,我最终到了这里,但我的内存管理没有任何问题:

- (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 我 -release 它。

现在看起来像一个框架错误?我检查了 iPhone OS 3.0 和 3.1,每次我像这样使用 NSTimer 时都会出现这个问题。知道还有什么问题吗?

(我的内存泄漏扫描间隔是 0.1 秒。但同样是 5 秒)

【问题讨论】:

  • stopAnimationTimer 是做什么的?我认为您需要使计时器无效(我希望您在 stopAnimationTimer 方法中这样做)。
  • 是的,它只是使计时器无效并将属性设置为 nil。

标签: iphone memory-management memory-leaks instruments


【解决方案1】:

请勿拨打-[NSTimer dealloc]。永远。

在这种情况下,-scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: 由-invalidate 平衡。您无需在计时器对象上调用-dealloc 或-release。

【讨论】:

  • +1 应该是对的,如果invalidate 之后执行release 计时器。因为他使用self.animationTimer = timer;,这将首先释放旧值,然后保留新值,因此这应该是安全的。
【解决方案2】:

除非您的stopAnimationTimer 方法是invalidate'ing 和release'ing(然后设置为nil)您的animationTimer 属性,否则您正在泄漏内存。

【讨论】:

  • 你的意思是release'ing 而不是dealloc'ing,不是吗?
【解决方案3】:

我找到了:我对我的计时器有一个强烈的参考。运行循环保留它。所以 RC 是 2。但是因为 Timer 还持有对目标的强引用(在我的例子中保留了计时器),所以我遇到了死锁情况。 -dealloc 从未被调用过,因此我的计时器从未被释放。见鬼。

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 2011-06-26
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2020-07-22
    • 2010-10-13
    • 2019-01-28
    相关资源
    最近更新 更多