2011-07-09 29 views
15

En Objective-C ¿cuál es la diferencia entre el acceso a una variable en una clase mediante -> (operador de flecha) y . (operador punto)? ¿Es -> el que se usa para acceder directamente contra el punto (.) no es directo?¿Cuál es la diferencia entre '->' (operador de flecha) y '.' (operador de punto) en Objective-C?

+1

pregunta similar: [punto (“”) y el operador de flecha (“->”) el uso del operador en C vs. Objective-C] (http://stackoverflow.com/q/9072688/642706) –

Respuesta

9

La flecha, ->, es una abreviatura para un punto en combinación con una referencia a un puntero, estos dos son lo mismo de algunos puntero p:

p->m 
(*p).m 

La notación flecha se hereda de C y C tiene porque el operador de acceso al miembro de estructura (.) se vincula más libremente que el operador de desreferenciación de puntero (*) y nadie quiere escribir (*p).m todo el tiempo ni quiere cambiar la precedencia del operador para hacer que la gente escriba *(p.m) para desreferenciar un puntero dentro de una estructura. Por lo tanto, se agregó la flecha para que pueda hacer ambos p->m y *s.p con sensatez sin la fealdad de los paréntesis.

0

Cuando se utiliza el operador flecha ptr->member está implícita eliminación de referencias a ese puntero. Es equivalente a (*ptr).member. Cuando envía mensajes a un puntero de objeto, el puntero también se desreferencia implícitamente.

18

-> es el operador tradicional C para acceder a un miembro de una estructura referenciado por un puntero. Dado que los objetos Objective-C se utilizan (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 a la instancia de variable name, declaró en SomeClass (o una de sus superclases), que corresponde al objeto obj.

Por otro lado, . es (generalmente) utilizado como el dot syntax para los métodos getter y setter . Por ejemplo:

SomeClass *obj = …; 
NSLog(@"name = %@", obj.name); 

es equivalente a usar el método getter name:

SomeClass *obj = …; 
NSLog(@"name = %@", [obj name]); 

Si name es una declared property, es posible dar a su método getter otro nombre.

La sintaxis de punto también se utiliza para métodos setter. Por ejemplo:

SomeClass *obj = …; 
obj.name = @"Jim"; 

es equivalente a:

SomeClass *obj = …; 
[obj setName:@"Jim"]; 
+6

la distinción es más evidente si el nombre de la variable de instancia diferente a la propiedad (por ejemplo '@synthesize name = ivar_name').Entonces solo puede acceder a la variable de instancia con 'someObject-> ivar_name' y solo puede acceder al getter de propiedad con' someObject.name'. – Chuck

+0

@Bavarious Encuentro esta respuesta confusa en este momento, ¿por qué hay tanta discusión sobre qué es "nombre"? Si el nombre es el método getter/setter del tipo de instancia. obj, un puntero, debe ser referenciado antes de poder acceder al nombre, cualquiera que sea el nombre, corrent? ¿No debería su respuesta simplemente que obj-> name es igual que (* obj) .name? ¿O está diciendo su respuesta, en parte, que los buscadores/establecedores de Objective C no tienen que respetar el puntero de obj y simplemente están disponibles usando notación de puntos? Quizás si no se usaron elipses para cada declaración de SomeClass * obj = ...; Lo entendería mejor ... :) –

+0

@Chuck ¿Qué significa "La clase Objective-C es una estructura"? ¿Qué significa para una clase ser una estructura? ¿No son esencialmente diferentes? las clases son tipos de referencia y las estructuras son tipos de valores? (Lo siento, te di un "pinback" pero Bavarious ya no usa su cuenta) – Honey

Cuestiones relacionadas