2009-10-01 8 views
0

J'ai une application simple qui compte jusqu'à minuit, puis émet un bip sonore encore et encore et clignote l'étiquette indiquant l'heure. Ainsi, le clignotement d'étiquette utilise un NSTimer, tandis que le bip suit son propre Thread, de sorte que la fonction C pure (pour le rappel d'achèvement de l'id sonore du système) peut utiliser [NSThread sleepForTimeInterval: ...]; attendre un peu entre deux si vous jouez le bip d'alarme. Donc, je reçois deux messages d'erreur lors de l'exécution disant qu'il n'y a pas de pool de libération automatique et il va juste fuir. C'est parce que dans la méthode que j'appelle dans un nouveau thread, il y a deux @ "Strings" qui sont utilisés pour créer l'ID Sound System (le nom de fichier et l'extension). Y at-il un moyen que je ne peux pas utiliser un pool autorelease puisque ce sont les deux seules choses qui essayent jamais de l'utiliser. Merci.iPhone dev multi threaded, NSAutoreleasePool

Ou devrais-je utiliser deux NSTimers au lieu d'un autre thread? La réponse de Ben Gottlieb était correcte, mais j'ai décidé d'utiliser un autre NSTimer à la place parce que j'ai oublié comment il n'est pas vraiment synchronisé au moment où vous dormez le thread comme l'exécution réelle du code avant qu'il ne prenne un peu de temps. Et cela rend les choses symétriques;).

Répondre

2

Il suffit de créer un pool autorelease dans votre méthode de fil:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

...thread body...

[pool release];

+0

Quelle est la différence entre cela et '[vidange de la piscine];'? – mk12

+0

La méthode '-drain' est la méthode préférée la plus récente, qui joue également bien avec le garbage collection. La méthode est disponible sur 10.4+, je crois. –

+0

Je suis sur iphone, pas OS X. – mk12

Questions connexes