Remarque: Il est probablement utile de faire défiler la page pour lire mes modifications.Placement d'un NSTimer dans un thread séparé
J'essaie de configurer un NSTimer dans un thread séparé afin qu'il continue à se déclencher lorsque les utilisateurs interagissent avec l'interface utilisateur de mon application. Cela semble fonctionner, mais Leaks signale un certain nombre de problèmes - et je crois que je l'ai réduit à mon code temporel.
Actuellement, updateTimer tente d'accéder à NSArrayController (timersController) qui est lié à NSTableView dans l'interface de mes applications. De là, je prends la première ligne sélectionnée et modifie sa colonne timeSpent. Remarque: le contenu de timersController est une collection d'objets gérés générés via des données de base. A la lecture, je crois que ce que je devrais essayer est d'exécuter la fonction updateTimer sur le thread principal, plutôt que dans mon thread secondaire timers.
Je poste ici dans l'espoir que quelqu'un avec plus d'expérience peut me dire si c'est la seule chose que je fais mal. Ayant lu la documentation d'Apple sur Threading, je l'ai trouvé un domaine extrêmement vaste.
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];
}
MISE À JOUR
Je suis encore totalement perdu en ce qui concerne cette fuite. Je sais que je suis en train de faire quelque chose de mal, mais j'ai dépouillé mon application jusqu'à ses os et je n'arrive toujours pas à le trouver. Pour des raisons de simplicité, j'ai téléchargé mon code de contrôleur d'applications à: a small pastebin. Notez que j'ai maintenant enlevé le code de thread de minuterie et ai plutôt choisi d'exécuter la minuterie dans un looploop séparé (comme suggéré ici).
Si je mets les Fuites Appel Arbre pour cacher les symboles manquants et bibliothèques du système, je me montre la sortie suivante:
EDIT: Liens vers les screenshots brisés et enlevés à cet effet.
Pourquoi configurez-vous une boucle d'exécution supplémentaire? Votre minuterie peut normalement fonctionner correctement avec la boucle d'exécution principale. – zneak
Le lien pastebin est mort. –