frac
n'est en fait pas la même dans les deux programmes.
A C Fraction
est un struct
Il s'agit d'un type de base sans opérateurs surchargés, qui ne peut être construit et détruit que par défaut. Si vous définissez des fonctions ou des champs sur la structure, la façon d'accéder à ces propriétés dans le fichier C
est avec le point ( .
). Objective-C conserve cet opérateur lorsque vous utilisez struct
s. Pour plus de commodité, vous pouvez effectuer une opération de déréférencement et de pointage en utilisant la flèche ( ->
) (les deux expressions équivalentes que vous mentionnez). Objective-C préserve également cela lors de l'accès à struct
s.
Un programme en Objective-C Fraction
dans votre exemple, cependant, est probablement (on pourrait le supposer) un pointeur d'au moins type id
qui est simplement un nom de classe et un pointeur vers l'instance de cette classe sous le capot. Il est également très probable qu'il s'agisse d'une sous-classe de NSObject
o NSProxy
. Ces classes Objective-C sont particulières dans la mesure où elles comportent toute une série d'opérations prédéfinies en plus d'une simple classe C
(si vous voulez vraiment creuser la question, vous pouvez jeter un coup d'œil à la structure de l'UE). Référence pour l'exécution d'Objective-C ). Il est également important de noter qu'une classe Objective-C est toujours un pointeur .
L'une des opérations les plus fondamentales est objc_msgSend
. Lorsque nous opérons sur ces types d'objets, le compilateur Objective-C interprète un point ( .
) ou la syntaxe des crochets ( [object method]
) comme un objc_msgSend
l'appel de la méthode. Pour des informations plus détaillées sur ce qui se passe réellement ici, voir cette série d'articles par Bill Bumgarner, un ingénieur d'Apple qui supervise le développement du runtime Obj-C.
La flèche ( ->
) n'est pas vraiment censé être utilisé sur des objets Objective-C. Comme je l'ai dit, les instances de classe Objective-C sont des structures C avec une couche de communication supplémentaire, mais cette couche de communication est essentiellement contournée lorsque vous utilisez la flèche. Par exemple, si vous ouvrez Xcode et tapez [UIApplication sharedApplication]->
et ensuite faire apparaître la liste des méthodes à compléter, vous voyez ceci :
Ici, vous pouvez voir un groupe de champs normaux auxquels nous accédons généralement avec la syntaxe des crochets (comme [[UIApplication sharedApplication] delegate]
). Ces éléments particuliers sont toutefois les C
qui stockent les valeurs de leurs propriétés Objective-C respectives.
Donc, vous pouvez grossièrement penser à ça comme ça :
Opérateur point sur un objet C
- (au moment de l'exécution) Valeur de retour du champ
Opérateur de flèche sur un objet C (pointeur)
- Pointeur déréférencé
- Valeur de retour du champ
Opérateur point/parenthèses sur un objet Objective-C (pointeur)
- (au moment de la compilation) Remplacer par un appel à
objc_msgSend
- (au moment de l'exécution) recherche la définition de la classe Obj-C, lève une exception si quelque chose ne va pas.
- Pointeur déréférencé
- Valeur de retour du champ
Opérateur de flèche sur un objet Objective-C (pointeur)
- (au moment de l'exécution) Pointeur déréférencé
- Valeur de retour du champ
Je simplifie certainement à l'extrême, mais pour résumer : les opérateurs flèches semblent faire la même chose dans les deux cas, mais l'opérateur point a une signification supplémentaire/différente en Objective-C.