2009-08-27 4 views
1

Je souhaite créer une application sur iPhone dans laquelle je souhaite utiliser NSThread. J'ai créé un fil à l'aideNSThread, NSTimer et AutoreleasePools dans une application iPhone SDK

[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,

-(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"); 

} 

Je peux maintenant pas en mesure d'appeler la méthode OnTimer NSTimer Dans doThread(). Mais je peux voir le "après minuterie" imprimé dans le journal. Est-ce que tout ce que je ne peux pas utiliser le NSTimer dans le fil?

C'est aussi ce que je peux obtenir pendant l'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. Merci.

+1

Vous devriez probablement nous en dire un peu plus sur la raison pour laquelle vous voulez avoir une approche multi-thread lorsque la plupart des applications qui traitent des touches ne ont pas besoin aller à de telles longueurs. – mahboudz

Répondre

0

Je ne suis pas sûr de comprendre votre question à propos de la méthode onTimer. Pouvez-vous le répéter?

En ce qui concerne:

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 aurait pour en créer un seul. 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étachez le thread, cela est probablement la cause de l'erreur. Les threads détachés n'ont pas de pools d'autorelease, vous devez donc créer le vôtre.

Voir la documentation:

Autorelease Pools

7

NSTimer horaires ses événements de temps sur le thread courant NSRunLoop --Le ne démarre pas.

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 doit pas exécuter les événements de minuterie 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]; 
}