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