2010-01-18 2 views
1

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

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

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

ответ

0

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

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

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

через вызов:

(аннулируются) ADDTimer: режим (NSString *)

: (NSTimer *) aTimer forMode?

+0

Я не создаю NSRunLoop. Я просто получаю ссылку на текущий цикл, который является текущим циклом запуска потока. – Unis

2

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

+0

На самом деле это может быть так, спасибо. Любая идея, как я могу попытаться обновить свой пользовательский интерфейс из вторичных потоков, не запускаясь в эту утечку памяти? – Unis

+0

Использование -performSelectorOnMainThread: withObject: waitUntilDone :. Однако, если это ваш таймер, тогда нет смысла запускать его в своем потоке. – Darren

+0

Единственная причина, по которой я хочу, чтобы таймер работал на своем потоке, потому что я постоянно использую его для каждого игрока, поэтому он используется во время выполнения приложения, также я заметил проблему с производительностью при взаимодействии с пользовательским интерфейсом во время работы таймер на основном потоке, вот почему я перешел во вторую нить, любые советы приветствуются ... – Unis

Смежные вопросы