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?
Respuesta
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.
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.
->
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"];
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
@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 ... :) –
@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
- 1. operador de flecha vs. operador de punto
- 2. cuál es la diferencia entre operador de punto y operador de resolución de alcance
- 3. ¿Cuál es la diferencia entre el operador "=" y "==" en Bash?
- 4. Operador de flecha (->) en C
- 5. ¿Cuál es la diferencia entre VBScript's y el operador &?
- 6. ¿Cuál es la diferencia entre el nuevo operador y Class.newInstance()?
- 7. diferencia entre operador global y operador miembro
- 8. ¿Cuál es la diferencia entre operator >> y operator >>> en java?
- 9. ¿Cuál es la diferencia entre ">" y "&>" en bash?
- 10. ¿Cómo funciona el operador de doble flecha (=>) en Perl?
- 11. ¿Cuál es el punto del operador unario plus en Ruby?
- 12. ¿Cuál es la diferencia entre los iguales de Java() y el operador de C++ ==?
- 13. ¿cuál es el nombre oficial del operador de flecha (->) de C++?
- 14. ¿Cuál es la diferencia entre los dos puntos ":" y la flecha adiposa "=>"
- 15. diferencia entre operador like y regex
- 16. ¿Cuál es el motivo de la diferencia entre -> y. en c/C++?
- 17. ¿Cuál es la diferencia entre las cláusulas where y el operador && en LINQ-to-SQL?
- 18. En Actionscript 3, ¿cuál es la diferencia entre el operador "in" y el método "hasOwnProperty"?
- 19. ¿Cuál es la diferencia entre "||" operador y función concat en Oracle?
- 20. ¿Cuál es la diferencia entre <% %> y <%=%>?
- 21. ¿Cuál es la diferencia entre <%# %> y <%= %>?
- 22. ¿Cuál es la diferencia entre> = y =>?
- 23. ¿Cuál es el punto del operador nulo en JavaScript?
- 24. Diferencia entre C++ 0x lambdas y operador(), cierre y functor
- 25. cuál es la diferencia entre '! =' Y '<>' en MySQL
- 26. Comparación de la diferencia de rendimiento de T-SQL entre y '<' '>' operador?
- 27. Diferencia entre == operador y el método Equals() en C#?
- 28. ¿Cuál es la diferencia cuando se aplica un nuevo operador?
- 29. CoffeeScript, Cuándo usar la flecha adiposa (=>) sobre la flecha (->) y viceversa
- 30. aplicación recursiva de operador->
pregunta similar: [punto (“”) y el operador de flecha (“->”) el uso del operador en C vs. Objective-C] (http://stackoverflow.com/q/9072688/642706) –