我在我的视图类中使用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;
}
答案 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
。