2013-02-06 6 views
-4

Aujourd'hui, j'ai lu "Pro Objective-C Design Patterns pour iOS" par Carlo Chung. Je lu à propos de modèle Adapter et a vu cette méthode déclarée dans le protocole:Que signifient * et &

-(void) command: (SetStrokeColorCommand *) command 
     didRequestColorComponentsForRed: (CGFloat *) red 
            green: (CGFloat *) green 
            blue: (CGFloat *) blue; 

Vous pouvez le voir à la page 115 du livre. Que cette méthode utilisée

[delegate_ command:self didRequestColorComponentsForRed: &redValue 
                green: &greenValue 
                blue: &blueValue]; 

Et puis la déclaration de cette méthode à la page 118

-(void) command: (SetStrokeColorCommand *) command 
     didRequestColorComponentsForRed: (CGFloat *) red 
            green: (CGFloat *) green 
            blue: (CGFloat *) blue 
{ 
    *red = [redSlider_ value]; 
    *green = [greenSlider_ value]; 
    *blue = [blueSlider_ value]; 
} 

Que signifient * dans la déclaration (* rouge, * vert * bleu) et que signifient & (& RedValue ...)? J'ai vu & avec seulement & erreur dans le code.

+11

Lire du matériel sur Pointer en C ou C++. – CRDave

+0

Ummm ... «pointeurs»? – sgarizvi

+3

& est l'adresse-de l'opérateur, * déclare une variable comme un pointeur, ou en dérives un déjà déclaré http://www.cplusplus.com/doc/tutorial/pointers/ –

Répondre

6

* est le déclarateur de pointeur ou l'opérateur de déréférencement. Dans une déclaration, * indique une variable pointeur.

& est l'opérateur d'adresse.

Side note:

Vous devriez apprendre les rudiments d'une langue avant d'essayer des livres plus avancés.

2

Comme certaines personnes l'ont souligné, elles sont liées à des pointeurs. Il y a toute une mine d'informations à ce sujet, cependant, si vous êtes nouveau, vous pourriez trouver cela un peu déroutant.

Pour signaler ce que vous devez savoir ...

La plupart du temps, vous avez une entrée et une sortie à une fonction.

- (int)roundMyFloat:(float)float; 

Ici, l'entrée est un flottant et la sortie est un int.

Parfois, vous aurez besoin de plus d'une sortie pour une méthode. Une situation courante est l'endroit où vous pourriez vouloir retourner un code d'erreur ainsi qu'un paramètre de succès.

- (BOOL)doSomthing:(NSError**)error; 

Vous utiliseriez cela comme si ...

NSError* error = nil; 
BOOL sucess = [myInstance doSomething:&error]; 
if (!sucess) 
{ 
    NSLog(@"Error: %@", error); 
} 

Vous passez la error en tant que 'sortie paramter'. Le code pour doSomthing prendra votre erreur et la remplira avec des informations si nécessaire.

Vous devez déclarer le paramètre d'erreur avec deux * « s dans la déclaration de méthode (NSError**) parce que vous dites que vous voulez un pointeur vers un objet d'erreur et un objet d'erreur est en fait un pointeur lui-même - de sorte que son un pointeur vers un pointeur .

Lorsque vous transmettez l'erreur dans la méthode [myInstance doSomething:&error];, vous utilisez le symbole & pour indiquer 'prendre l'adresse mémoire de mon objet d'erreur'. Dans votre exemple, redgreen et blue sont des paramètres de sortie. La méthode didRequestColorComponentsForRed modifie les valeurs que vous lui transmettez.Contrairement à l'exemple NSError, redgreen et blue ne sont pas des objets, ils n'ont donc besoin que d'une étoile dans la déclaration de méthode. Ceci dit 'accepter un pointeur vers une valeur CGFloat en tant que paramètre'. Lorsque vous invoquez la méthode didRequestColorComponentsForRed, vous transmettez les composants de couleur en utilisant le symbole & comme dans l'exemple NSError. Cela dit, prenez l'adresse mémoire de ma valeur CGFloat et transmettez-la à la fonction.

Ne vous inquiétez pas trop de la syntaxe & et * pour l'instant - rappelez-vous ce que c'est pour (paramètres de sortie). Vous devriez finalement lire à ce sujet pour y arriver (c'est plutôt cool en fait!).

Espérons que cela aide - et n'ayez pas peur de poser des questions.