Nota: Probabilmente vale la pena scorrere verso il basso per leggere la mia modifica.Inserimento di un NSTimer in una filettatura separata
Sto provando a configurare un NSTimer in un thread separato in modo che continui a sparare quando gli utenti interagiscono con l'interfaccia utente della mia applicazione. Questo sembra funzionare, ma Leaks riporta una serie di problemi - e credo di averlo ridotto al mio codice timer.
Attualmente ciò che accade è che updateTimer tenta di accedere a un NSArrayController (timersController) che è associato a un NSTableView nell'interfaccia delle mie applicazioni. Da lì, afferro la prima riga selezionata e modifica la sua colonna timeSpent. Nota: il contenuto di timersController è una raccolta di oggetti gestiti generati tramite Core Data.
Dalla lettura in giro, credo che ciò che dovrei provare a fare è eseguire la funzione updateTimer sul thread principale, piuttosto che sul thread secondario dei timer.
Sto postando qui nella speranza che qualcuno con più esperienza possa dirmi se è l'unica cosa che sto sbagliando. Dopo aver letto la documentazione di Apple su Threading, l'ho trovato un argomento molto vasto.
NSThread *timerThread = [[[NSThread alloc] initWithTarget:self selector:@selector(startTimerThread) object:nil] autorelease];
[timerThread start];
-(void)startTimerThread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
activeTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES] retain];
[runLoop run];
[pool release];
}
-(void)updateTimer:(NSTimer *)timer
{
NSArray *selectedTimers = [timersController selectedObjects];
id selectedTimer = [selectedTimers objectAtIndex:0];
NSNumber *currentTimeSpent = [selectedTimer timeSpent];
[selectedTimer setValue:[NSNumber numberWithInt:[currentTimeSpent intValue]+1] forKey:@"timeSpent"];
}
-(void)stopTimer
{
[activeTimer invalidate];
[activeTimer release];
}
UPDATE
che sto ancora totalmente perso per quanto riguarda questa perdita. So che sto ovviamente facendo qualcosa di sbagliato, ma ho spogliato la mia applicazione fino alle sue ossa nude e ancora non riesco a trovarlo. Per motivi di semplicità, ho caricato il mio codice del controller delle applicazioni su: a small pastebin. Si noti che ora ho rimosso il codice del thread del timer e invece ho optato per eseguire il timer in un runloop separato (come suggerito qui).
Se ho impostato le perdite Chiamata albero per nascondere entrambi i simboli mancanti e librerie di sistema, che sto mostrato il seguente output:
EDIT: Collegamenti a immagini di rotto e Perciò rimosso.
Perché si imposta un ciclo di esecuzione aggiuntivo? Il tuo timer può funzionare normalmente bene con il ciclo di esecuzione principale. – zneak
Il collegamento pastebin è morto. –