Я пытаюсь запустить таймер в фоновом режиме моего приложения, я использую таймер в моем приложении, и я предпочел бы использовать его в фоновом режиме. Однако я получаю утечки памяти при попытке освободить NSAoutreleasePool. Мой Timer класс singleton, поэтому, если я запускаю новый таймер, старый таймер получает dealloc.Запуск NSTimer В NSThread?
+ (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 с применением autoreleasepool. Я получаю утечку в [timerNSPool release]; GeneralBlock-16 Маллок WebCore WKSetCurrentGraphicsContext
Что вызывает утечка обновление пользовательского интерфейса из вторичных потоков:
timeLabel.text = [NSString stringWithFormat:@"%d",--timeDuration];
Однако я добавил еще один метод updateTextLbl, то я зову его с помощью этой
[self performSelectorOnMainThread:@selector(updateTextLbl) withObject:nil waitUntilDone:YES];
на основной теме. У меня не было утечек вообще, но это победит цель иметь вторую нить.
Это мой первый пост, и я признателен за любую помощь спасибо ... заранее ....
Я не создаю NSRunLoop. Я просто получаю ссылку на текущий цикл, который является текущим циклом запуска потока. – Unis