3

在测试我的应用程序的内存泄漏时,我发现每当我以一个间隔启动 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
4

1 回答 1

5

当您关闭视图控制器时,您是否看到了这一点?我问这个是因为重复NSTimer保持对其的强引用target,如果您在关闭视图控制器时没有invalidate计时器,您将泄漏计时器和控制器本身,因为您将有一个强引用周期(又名保留循环) 在控制器和NSTimer.

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

于 2013-03-01T04:22:52.867 回答