2009-07-22 9 views
4

Voici le code:Objectif C Threading Question

for(int i = 0; i < personListViewController.peopleCount; i++) { 
    [NSThread detachNewThreadSelector:@selector(getPerson:) toTarget:self withObject:i]; 
} 

getPerson ressemble à ceci:

- (void)getPerson:(int)whichPerson { } 

Quand je construis, je reçois le texte suivant: avertissement: Argument passage 3 « detachNewThreadSelector: toTarget: withObject: 'fait un pointeur à partir d'un entier sans cast

Tout ce que je veux faire est de passer un int à getPerson via detachNewThrea dSelector et je ne peux pas comprendre comment diable pour l'obtenir de prendre n'importe quoi mais un pointeur d'objet. Qu'est-ce que j'oublie ici?

Répondre

12

Le sélecteur que vous transmettez en tant que premier argument à -[NSThread detachNewThreadSelector:toTarget:withObject:] doit prendre un seul argument de type id (un pointeur vers une instance d'objet). Bien que vous puissiez jouer à des jeux avec le fait que (sur la plupart des plates-formes), un pointeur est de la même taille qu'un int et que vous tapez votre valeur dans un id puis revenez à un int, vous ne devriez pas vous fier à ce comportement. Au lieu de cela, écrivez une méthode wrapper qui prend un argument NSNumber et envelopper votre int dans un NSNumber. La mise en œuvre de la méthode d'emballage pourrait être:

- (void)getPersonWithNumber:(NSNumber*)number { 
    [self getPerson:[number integerValue]]; 
} 

Votre boucle serait alors

for(NSInteger i = 0; i < personListViewController.peopleCount; i++) { 
     [NSThread detachNewThreadSelector:@selector(getPersonWithNumber:) toTarget:self withObject:[NSNumber numberWithInteger:i]; 
} 

Notez que j'ai converti de int à NSInteger tout au long. Sauf si vous vous connectez avec du code existant qui utilise int, vous devez utiliser NSInteger qui est un typedef pour l'entier de taille appropriée sur chaque plate-forme (32 ou 64 bits) dans le nouveau code Cocoa.

+0

Cela a fait l'affaire. Merci un million de fois. C'est toujours les petites choses qui me font tomber dans l'objectif-c. – lewsid

4

Vous devez envelopper l'entier dans une classe NSNumber, pour faire du nombre un objet.

[NSThread detachNewThreadSelector:@selector(getPerson:) toTarget:self withObject:[NSNumber numberWithInteger:i]]; 

NSThread ne prend pas primitives (comme int ou char), vous devez utiliser NSNumber!

Espérons que ça aide.