Запуск NSTimer внутри NSThread? - PullRequest
       8

Запуск NSTimer внутри NSThread?

1 голос
/ 18 января 2010

Я пытаюсь запустить таймер в фоновом режиме своего приложения, я интенсивно использую таймер в своем приложении и предпочитаю запускать его в фоновом режиме, однако я получаю утечки памяти при попытке освободить 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];

в основном потоке.У меня не было никаких утечек вообще, но это побьет цель иметь вторые темы.

Это мой первый пост, и я ценю любую помощь Спасибо ... заранее ....

Ответы [ 2 ]

2 голосов
/ 18 января 2010

Вы обновляете свой пользовательский интерфейс в +startTime:, но этот метод не запускается в основном потоке. Это может быть источником предупреждения WebCore, которое вы видите.

0 голосов
/ 18 января 2010

С манжеты NSRunLoop, который у вас есть, кажется немного неуместным.Из документов:

В общем случае вашему приложению не нужно ни создавать, ни явно управлять объектами NSRunLoop.Каждый объект NSThread, включая основной поток приложения, имеет объект NSRunLoop, автоматически создаваемый для него при необходимости.Если вам нужен доступ к циклу выполнения текущего потока, вы делаете это с помощью метода класса currentRunLoop.

У вас есть таймер, запускающий поток, который получает текущий цикл выполнения и пытается запустить его,Вы хотите связать таймер с этим циклом выполнения?

Через вызов:

(void) addTimer: (NSTimer *) aTimer forMode: (NSString *) mode

?

...