Cuál es la diferencia entre ‘->’ (operador de flecha) y ‘.’ (operador de punto) en Objective-C?

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.