En Objective-C, ¿cuál es la diferencia entre acceder a una variable en una clase usando ->
(operador de flecha) y .
(operador de punto)? ¿Es ->
usado para acceder directamente contra el punto ( .
) No es directo?
->
es el operador C tradicional para acceder a un miembro de una estructura a la que hace referencia un puntero. Como los objetos Objective-C se usan (normalmente) como punteros y una clase Objective-C es una estructura, puede usar ->
para acceder a sus miembros, que (normalmente) corresponden a variables de instancia. Tenga en cuenta que si intenta acceder a una variable de instancia desde fuera de la clase, la variable de instancia debe marcarse como pública.
Así por ejemplo:
SomeClass *obj = …; NSLog(@"name = %@", obj->name); obj->name = @"Jim";
accede al name
variable de instancia, declarado en SomeClass
(o una de sus superclases), que corresponde al objeto obj
.
Por otro lado .
usualmente se usa como la syntax de puntos para los métodos getter y setter . Por ejemplo:
SomeClass *obj = …; NSLog(@"name = %@", obj.name);
es equivalente a usar el name
método getter:
SomeClass *obj = …; NSLog(@"name = %@", [obj name]);
Si el name
es una propiedad declarada , es posible dar otro nombre a su método getter.
La syntax de punto también se usa para métodos setter. Por ejemplo:
SomeClass *obj = …; obj.name = @"Jim";
es equivalente a:
SomeClass *obj = …; [obj setName:@"Jim"];
La flecha, ->
, es una abreviatura de un punto combinado con una desreferencia del puntero, estos dos son los mismos para algunos punteros p
:
p->m (*p).m
La notación de flecha se hereda de C y C porque el miembro de la estructura que accede al operador ( .
) Se vincula más flojo que el operador de desreferenciación del puntero ( *
) y nadie quiere escribir (*p).m
todo el tiempo ni quiere cambie la precedencia del operador para hacer que las personas escriban *(pm)
para desreferenciar un puntero dentro de una estructura. Entonces, se agregó la flecha para que pudieras hacer tanto p->m
como *sp
sensiblemente sin la fealdad del paréntesis.
Cuando utiliza el operador de flecha ptr->member
, ptr->member
implícitamente ese puntero. Es equivalente a (*ptr).member
. Cuando envía mensajes a un puntero de objeto, el puntero también se desreferencia implícitamente.