NSThread, NSTimer et AutoreleasePools dans une application iPhone SDK

voix
1

Je veux créer un Appilication dans l'iPhone dans lequel je veux utiliser NSThread. J'ai créé un fil à l'aide

[NSThread detachNewThreadSelector:@selector(doThread:)
                             toTarget:self
                           withObject:nil];

Je veux que mon seul thread se chargera de toutes les touches et autres interactions de l'utilisateur et le second fil gérer la NSTimer. Donc, j'allouer NSTimer comme dans doThread (),

-(void) doThread:(NSString *)poststring {

    NSLog(@create thread:);

    [lock lock];
    T1 = [NSTimer scheduledTimerWithTimeInterval:(5)            
     target : self
     selector:@selector(onTimer)
     userInfo : nil
     repeats : YES];
     NSLog(@after timer);

    usleep(1);
    [lock unlock];
}

In onTImer,

-(void)onTimer

{
    NSLog(@in timer);

}

Maintenant, je ne peux pas en mesure d'appeler la méthode OnTimer NSTimer. Mais je peux voir le « après minuterie » imprimée dans les log.Is que tout ce que je ne peux pas utiliser le NSTimer dans le fil?

C'est aussi que je peux obtenir en exécution.

NSAutoreleaseNoPool(): Object 0xd15880 of class __NSCFDate autoreleased with no pool in place - just leaking
Stack: (0x305a2e6f 0x30504682 0x30525acf 0x27b5 0x3050a79d 0x3050a338 0x926ae155 0x926ae012)

S'il vous plaît aidez-moi pour cela. Je vous remercie.

Créé 27/08/2009 à 05:46
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Je ne suis pas sûr que je comprends votre question au sujet de la méthode ontimer. Pouvez-vous reformuler?

Pour ce qui est de:

NSAutoreleaseNoPool(): Object 0xd15880 of class __NSCFDate autoreleased with no pool in place - just leaking 

Quelques choses peuvent causer ceci:

Si vous n'êtes pas déléguer ou sous-classement un objet UIApplication, vous n'aurez pas une piscine autorelease en place et devrait en créer un sur votre propre. Cependant, la bonne réponse dans ce cas est juste pour être sûr que vous utilisez UIApplication correctement.

Dans ce cas cependant, puisque vous détacher le fil, qui est probablement la cause de l'erreur. fils détachés n'ont pas piscines autorelease, de sorte que vous auriez à créer votre propre.

Consultez la documentation:

Piscines autoRelease

Créé 27/08/2009 à 06:00
source utilisateur

voix
7

NSTimerhoraires ses événements de temps sur le courant NSRunLoopfil --Le ne démarre pas un.

Si tout ce que vous essayez de faire est de lancer quelque chose après un certain laps de temps, utilisez -[NSObject performSelector:withObject:afterDelay:]:

[self performSelector:@selector(onTimer) withObject:nil afterDelay:5.0f];

Si vous essayez de faire réellement travailler en arrière - plan, +[NSThread detachNewThreadSelector:toTarget:withObject:]fonctionnera comme prévu , mais vous ne devriez pas exécuter les événements d'horloge en arrière - plan sans NSRunLoop. En outre, vous aurez besoin d'envelopper votre code dans une piscine autorelease:

- (void)doThread:(NSString *)poststring
{
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     // Your code goes in here
     [pool drain];
}
Créé 27/08/2009 à 06:01
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more