在测试我的应用程序内存泄漏时,我发现每当我以一个间隔启动NSTimer时,它会显示CFArray(store-deque)和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
答案 0 :(得分:5)
当您解雇视图控制器时,您是否看到了这个?我问这个是因为重复的NSTimer
保留了对其target
的强引用,如果你在解除视图控制器时没有invalidate
计时器,你会泄漏计时器和控制器本身,因为你将在控制器和NSTimer
之间有一个强大的参考周期(又名retain cycle)。
顺便说一下,不要在控制器的invalidate
方法中尝试dealloc
,因为强引用周期后,dealloc
永远不会被调用。人们通常会invalidate
viewDidDisappear
。而且,很明显,如果您要invalidate
viewDidDisappear
viewDidAppear
计时器,您可能应该在viewDidLoad
而不是invalidate
创建计时器,以确保平衡使用{{1}}调用创建计时器。