如何在视图消失时暂停和重新启动NSTimer?

时间:2011-05-18 13:37:28

标签: objective-c cocoa-touch ios nstimer

我在我的视图类中使用NSTimer,每隔15秒调用一次。我的问题是,它工作正常,但我的应用程序变慢,因为它显示了整个应用程序的性能。因此,当我的视图从超级视图中消失时,我想暂停NSTimer,并在显示时重新启动计时器。请帮我解决问题。这是我的代码:

- (void) viewWillAppear:(BOOL)animated
{

    if(!Thread_bool)
    {
        //[spinner startAnimating];
        NSTimer *timer_new1=[[NSTimer alloc] init];
        timer_new1=[NSTimer scheduledTimerWithTimeInterval:2.0 target:self                selector:@selector(threadMethod) userInfo:nil repeats:YES];
        self.timer_new=timer_new1;
        [timer_new1 release];
        [self.tableView setEditing:NO];
        isEditing=NO;
        Thread_bool=YES;    
    }
}

-(void)viewWillDisappear:(BOOL)animated
{
    [self.timer_new invalidate];
    timer_new=nil;  
}

2 个答案:

答案 0 :(得分:8)

NSTimer *timer_new1=[[NSTimer alloc] init];
timer_new1=[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(threadMethod) userInfo:nil repeats:YES];
self.timer_new=timer_new1;
[timer_new1 release];

在第一行中,您已分配了一个计时器,在第二行中,另一个计时器已创建并分配给timer_new1。因此,您丢失了对前一行中分配的计时器的引用,并且该计时器已泄露。您不需要第一行alloc。这样做:

NSTimer *timer_new1 = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(threadMethod) userInfo:nil repeats:YES];

并删除[timer_new1 release];(我假设保留self.timer_new)。同样在viewWillDisappear执行self.timer_new = nil;而不是timer_new=nil;。添加self将调用setter并正确释放前一个计时器。

答案 1 :(得分:2)

你有两行正在创建NSTimer的实例。第一个是

    NSTimer *timer_new1 = [[NSTimer alloc] init];

,第二个是

    timer_new1 = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(threadMethod) userInfo:nil repeats:YES];

保留第一行创建的NSTimer对象,您似乎意识到这一点,因为您稍后尝试释放它。但是,上面的第二行是创建NSTimer的 new 实例,自动释放。执行此操作时,第一个未释放的NSTimer对象正在泄露!

如果您为timer_new设置了访问者方法以保留计时器,请从上方删除第一行,不要释放timer_new1