2008-12-19 10 views
3

J'ai une méthode Obj-C semblable à ceci:Affectation un entier en pointeur sans transtypage

-(void)getUserDefaults:(BOOL *)refreshDefaults 
{ 
    PostAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

    if (refreshDefaults) { 
     [appDelegate retrieveDefaults]; 
    } 
} 

Quand je l'appelle comme ça, je reçois pas d'avertissement:

[self getUserDefaults:NO]; 

Quand j'appelle comme ça je reçois un avertissement:

[self getUserDefaults:YES]; 

avertissement: Argument 1 passant de « getUserDefaults: » un entier en pointeur sans jeter

NOTE: Je l'appelle toujours le passage de la méthode NO, puis un peu plus tard je passe OUI

Quelqu'un peut-il me renseigner sur ce que la question est ici? Merci.

Répondre

15

getUserDefaults prend un BOOL *. Vous n'obtenez pas d'avertissement lorsque vous passez NO car NO est 0 et 0 est NULL, ce qui est un BOOL * légal. OUI est 1 et la même conversion n'est pas automatiquement sûre.

Vous devez faire en sorte que getUserDefaults prenne un BOOL normal au lieu d'un pointeur.

5

Je n'ai jamais vu de code Obj-C auparavant, mais je suis sûr que c'est parce que le 'refreshDefaults' est un pointeur sur BOOL alors qu'il devrait être un BOOL. Je ne connais pas les règles de typage dans Obj-C, mais on dirait que NO est défini comme 0 et le compilateur n'a aucun problème pour convertir cela en une valeur de pointeur (un pointeur NULL.) Ce ne serait pas le cas avec entier '1'. (Notez également que "if (refreshDefaults)" est un code valide qui vérifie le pointeur refreshDefaults par rapport au pointeur NULL)

1

Dans le premier cas, NO vaut par défaut 0 - le pointeur nul. C'est un Bool * valide. Yes prendra par défaut la valeur 1, et ainsi quand il est converti en Bool *, vous passez l'entier 1 in - qui est ensuite transformé en Bool *.

17

BOOL est un type primitif, pas une classe, de sorte que votre déclaration de méthode devrait être

-(void)getUserDefaults:(BOOL)refreshDefaults; 

à la place. La raison pour laquelle vous recevez l'avertissement est que 0 (qui correspond à NO) est une valeur de pointeur valide sans cast, équivalente à NULL, mais 1 (qui correspond à YES) isn ' t une valeur de pointeur valide sans cast.

+1

Les pointeurs vers les primitives sont parfaitement légaux. –

+0

Oui, mais il ne passe pas dans un pointeur vers BOOL, il passe juste dans un BOOL, c'est pourquoi il a cette erreur. – dancavallaro

3

Cool merci! Cela a du sens, et l'a réparé! Voici le code mis à jour pour référence:

-(void)getUserDefaults:(BOOL)refreshDefaults 
{ 
PostAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

if (refreshDefaults) { 
    [appDelegate retrieveDefaults]; 
} 
} 
+2

Quelques petites choses rapides: 1) vous devriez éditer votre question originale si vous voulez montrer le code fonctionnant contre le non-travail; ce n'est pas un forum. Deuxièmement, si quelqu'un vous a aidé, vous devriez leur donner du crédit en acceptant leur réponse :) –

Questions connexes