NSTimer 泄漏内存(CFArray?)

Posted

技术标签:

【中文标题】NSTimer 泄漏内存(CFArray?)【英文标题】:NSTimer leaking memory (CFArray?) 【发布时间】:2013-03-01 04:10:55 【问题描述】:

在测试我的应用程序的内存泄漏时,我发现每当我以一个间隔启动 NSTimer 时,它表明 CFArray(存储双端队列)和 CFArray(可变变量)的大小一直在增长。在我的实际应用中,Malloc 16 和 Malloc 32 等随着 CFArray 的大小增加。

问题:如何阻止这种“泄漏”?

代码:.h

@interface ViewController : UIViewController

    NSTimer *timerClock;
    int timer;

@end

代码:.m

- (void)viewDidLoad

    [super viewDidLoad];

    timer = 0;
    timerClock = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(counter) userInfo:nil repeats:YES];


- (void)counter



@end

【问题讨论】:

发布- (void)counter 代码。可能是导致泄漏 @Rob:您应该将其发布为答案。 实际上在我的测试应用程序中,- (void)counter 方法像上面一样是空的。只是指出 NSTimer 在我的测试中泄漏。 【参考方案1】:

当你关闭你的视图控制器时你看到这个了吗?我问这个是因为重复的NSTimer 强烈引用了它的target,如果你在关闭视图控制器时没有invalidate 计时器,你会泄漏计时器和控制器本身,因为你会在控制器和NSTimer 之间有一个强参考周期(又名retain cycle)。

顺便说一句,不要在控制器的dealloc 方法中尝试invalidate,因为在强引用循环中,dealloc 永远不会被调用。人们通常会在viewDidDisappearinvalidate。而且,很明显,如果您要在viewDidDisappear 中使用invalidate 您的计时器,您可能应该在viewDidAppear 而不是viewDidLoad 中创建它,以确保您在创建计时器与其@987654335 之间取得平衡@ 调用。

【讨论】:

不,我在启动我的应用程序后看到了这个。我还尝试将 NSTimer 附加到按钮上,以检查它是否确实是计时器泄漏,并且确实如此。 OP 中的代码几乎是我的测试应用程序中的所有代码及其泄漏。会不会是 ARC 的东西? 您是否在Leaks 工具或allocations 工具中看到了这一点?如果是后者,不要担心Overall Bytes,而是关注Live Bytes 和或# Living @Robert 该链接说的是我想说的,您不只是在viewDidLoad 中创建它并期望它自行清理。您必须在viewWillDisappear 中清理它(并且,那篇文章说,但我没有,因此您可能希望在viewDidAppear 中创建计时器)。但是文章关注的泄漏(正如我的回答)只有在视图控制器被关闭时才会显现出来。另一方面,您建议您在创建视图控制器时发生泄漏,我建议您将“总字节数”误解为泄漏。 我以前被这个问题困扰过。罗布的锤子敲在了他的头上。除非您在计时器上调用invalidate,否则重复的 NSTimers 及其目标将永远不会被释放。 已修复。谢谢抢!没有更多的泄漏。你对我对“整体字节”的误解也是正确的。早上六点,别怪我! :P

以上是关于NSTimer 泄漏内存(CFArray?)的主要内容,如果未能解决你的问题,请参考以下文章

解决NSTimer存在的内存泄漏的问题

第四十三篇利用NSProxy解决NSTimer内存泄漏问题

APP出现内存泄漏的几种情况

百度程序员开发避坑指南(移动端篇)

iOS内存泄漏检测方法

NSTimer解除循环引用