Я пытаюсь запустить таймер в фоновом режиме своего приложения, я интенсивно использую таймер в своем приложении и предпочитаю запускать его в фоновом режиме, однако при попытке освободить NSAoutreleasePool возникают утечки памяти. Мой класс Timer - одноэлементный, поэтому, если я запускаю новый таймер, старый таймер освобождает его.
+ (void)timerThread{
timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimerThread) object:nil]; //Create a new thread
[timerThread start]; //start the thread
}
//the thread starts by sending this message
+ (void) startTimerThread
{
timerNSPool = [[NSAutoreleasePool alloc] init];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(startTime:) userInfo:nil repeats:YES];
//timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(startTime:) userInfo:nil repeats:YES];
//[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
[runLoop run];
[timerNSPool release];
}
+ (void)startTime:(NSTimer *)theTimer{
if(timeDuration > 1)
timeLabel.text = [NSString stringWithFormat:@"%d",--timeDuration];
else{
[self stopTimer];
[delegate timeIsUp];
}
}
+ (void) stopTimer{
if(timer != nil)
{
[timerThread release];
[timeLabel release];
[timer invalidate];
timer = nil;
}
}
У меня никогда не было проблем с запуском NSTimer в runLoop основного потока с автоматическим выпуском приложения. У меня утечка на [выпуск timerNSPool]; GeneralBlock-16 Malloc WebCore WKSetCurrentGraphicsContext
Причина утечки - это обновление пользовательского интерфейса из вторичного потока:
timeLabel.text = [NSString stringWithFormat:@"%d",--timeDuration];
Однако я добавил еще один метод updateTextLbl, затем я вызываю его, используя этот
[self performSelectorOnMainThread:@selector(updateTextLbl) withObject:nil waitUntilDone:YES];
в основном потоке. У меня вообще не было утечек, но это противоречит цели наличия второго потока.
Это мой первый пост, и я ценю любую помощь. Спасибо ... заранее ....