La passation d'une NSTimer dans un thread séparé

Remarque: C'est probablement la peine de défilement vers le bas pour lire mon montage.

Je suis en train de configurer un NSTimer dans un thread séparé de sorte qu'il continue à feu lorsque les utilisateurs interagissent avec l'INTERFACE utilisateur de mon application. Cela semble fonctionner, mais les Fuites des rapports d'un certain nombre de questions - et je crois que j'en ai rétréci vers le bas à mon code timer.

Actuellement ce qui se passe est que updateTimer tente d'accéder à un NSArrayController (timersController) qui est lié à un NSTableView dans mon interface d'applications. À partir de là, je prends la première ligne sélectionnée et de modifier son temps consacré colonne. Remarque: le contenu de timersController est une collection d'objets gérés généré via la Base de Données.

De lecture autour, je crois que ce que je devrais essayer de faire est d'exécuter l'updateTimer fonction sur le thread principal, plutôt que dans mon minuteries thread secondaire.

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. Après avoir lu la documentation d'Apple sur le Filetage, j'ai trouvé une plus grande zone de sujet.

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 évidemment faire quelque chose de mal, mais j'ai dépouillé mon application vers le bas à son os à nu et ne peut toujours pas l'air de trouver ça. Pour simplicities souci, j'ai téléchargé mes applications de contrôleur de code: un petit pastebin. Notez que j'ai maintenant supprimé la minuterie code de thread et opté pour exécuter la minuterie dans un autre runloop (comme expliqué ici).

Si j'ai mis les Fuites de l'Arbre d'Appel de cacher les deux Symboles Manquants et les Bibliothèques Système, je me suis montré le résultat suivant:

EDIT: des Liens vers des captures d'écran cassé et donc supprimé.

Pourquoi avez-vous mis en place une course supplémentaire en boucle? Votre minuterie peut normalement fonctionner très bien avec la course principale de la boucle.
Le pastebin lien est mort.

OriginalL'auteur ndg | 2010-04-26