2010-12-19 2 views
0

s'il vous plaît voir le code comme suit:comment passer le pointeur et obtenu le résultat en fonction?

- (BOOL)postAction :(NSString*) url params:(NSDictionary*) params bodySize:(NSNumber**)bodySize 
{ 
... 
int size = 1999; 

NSNumber* value =[[NSNumber alloc] initWithInt:size]; 


bodySize = &value; 


...} 

utiliser la fonction comme suit:

NSNumber* size ; 
[self postAction:@"http://webserver/ss.php" params:params bodySize:&size]; 



// can not got the size value at all… 


int i = [size intValue]; 
//will throw nil exception ! 

ma question est que la façon de corriger ce code ci-dessus?

merci beaucoup pour votre aide!

Cordialement

+2

Tu ne peux pas faire revenir l'objet 'NSNumber' à la place? – BoltClock

+0

Je ne sais pas si vous l'avez déjà vu, mais si vous écrivez une méthode comme celle-ci, vous devriez vraiment regarder la bibliothèque gratuite ASIHttpRequest (en fait quelques classes) qui vous permet de publier facilement des données. –

Répondre

1

Je pense que vous voulez ceci:

//bodySize = &value; 
*bodySize = value; 
+1

Probablement pas; passer par référence est extrêmement rare applications iOS correctement écrit. – bbum

+0

@bbum C'est incorrect. Tout au long du code d'apple, 'NSError's sont passés par référence, ainsi que d'autres instances avec' NSScanner'. –

+0

Oui; ce serait le seul cas d'utilisation rare et spécifique ... Quand j'ai dit «rare», je voulais dire «ce modèle est extrêmement rare», pas que, une fois décidé, un motif particulier ne sera pas utilisé largement. Il y a, quoi, une demi-douzaine à une douzaine * d'autres * utilisations de passer par référence à travers les APIs du framework? (Merci pour le commentaire, il portait explication, certainement). – bbum

2

Idéalement, vous devriez toujours vérifier le pointeur avant déréférencement il:

If (bodySize) 
    *bodySize = value; 
0

Je suis d'accord avec les deux réponses ci-dessus. Pour être plus clair, NSNumber est un objet (contrairement à NSInteger ou NSUInteger). Vous devriez donc pointer directement votre pointeur sur cet objet.

4

Si vous utilisez un renvoi par référence dans iOS ou Mac OS X, vous vous trompez probablement.

Sérieusement - passer par référence est un modèle extrêmement rare à utiliser. Il est à peu près entièrement réservé à (NSError**) à travers les API.

Cela ne veut pas dire qu'il n'y a pas de raison d'utiliser le renvoi par référence, mais ce n'est pas le cas. Plus précisément, si vous devez renvoyer un NSNumber, retournez-le!

- (NSNumber *) foo; 

Si cette méthode retourne nil, qui est tout aussi bon que le retour d'un BOOLNO. Et il vous met à suivre le modèle très courant d'utiliser NSError:

- (NSNumber *) foo: (NSError **) error; 
Questions connexes