He visto en algunos ejemplos de iPhone que los atributos han usado un guión bajo _ delante de la variable. Alguien sabe que significa esto? O como funciona?
Un archivo de interfaz que estoy usando se ve así:
@interface MissionCell : UITableViewCell {
Mission *_mission;
UILabel *_missionName;
}
@property (nonatomic, retain) UILabel *missionName;
- (Mission *)mission;
No estoy seguro exactamente de lo que hace lo anterior, pero cuando trato de configurar el nombre de la misión como:
aMission.missionName = missionName;
Me sale el error:
solicitud de miembro 'missionName' en algo que no sea una estructura o unión
property
en el archivo .h y en el .m fie acceder a ella usandoself
como tal,self.someProperty
. ¿Es este el camino correcto? ¿O debería estar usando los ivars en el código?Es solo una convención de legibilidad, no hace nada especial para el compilador. Verá que las personas lo usan en variables de instancias privadas y nombres de métodos. En realidad, Apple recomienda no usar el guión bajo (si no tiene cuidado podría anular algo en su superclase), pero no debería sentirse mal por ignorar ese consejo. :)
fuente
El único propósito útil que he visto es diferenciar entre variables locales y variables miembro como se indicó anteriormente, pero no es una convención necesaria. Cuando se combina con una @property, aumenta la verbosidad de las declaraciones de sintetización:
@synthesize missionName = _missionName;
, y es feo en todas partes.En lugar de usar el guión bajo, solo use nombres de variables descriptivas dentro de métodos que no entren en conflicto. Cuando deben entrar en conflicto, el nombre de la variable dentro del método debe sufrir un guión bajo, no la variable miembro que pueden usar varios métodos . El único lugar común en el que esto es útil es en un setter o en un método init. Además, hará que la declaración @synthesize sea más concisa.
Editar: con la última función de compilación de auto-síntesis, ahora uso guión bajo para el ivar (en la rara ocasión en que necesito usar un ivar para que coincida con lo que hace la auto-síntesis.
fuente
Realmente no significa nada, es solo una convención que algunas personas usan para diferenciar las variables miembro de las variables locales.
En cuanto al error, parece que aMission tiene el tipo incorrecto. ¿Cuál es su declaración?
fuente
Esto es solo para la convención de nomenclatura de las propiedades de sintetización.
Cuando sintetice variables en el archivo .m, Xcode le proporcionará automáticamente inteligencia variable.
fuente
Tener un guión bajo no solo hace posible resolver sus ivars sin recurrir al uso de self.member sintaxis sino que hace que su código sea más legible ya que sabe cuándo una variable es un ivar (debido a su prefijo de guión bajo) o un argumento miembro (no guión bajo) )
Ejemplo:
fuente
self.image
, que accede a la propiedad. La única vez que debe acceder a la variable de instancia_image
, directamente está dentro de losinit
métodos y eldealloc
método, cuando llamar a cualquier otro método puede ser arriesgado (ya que el objeto está medio inicializado o medio desasignado).Este parece ser el elemento "maestro" para preguntas sobre self.variableName vs. _variablename. Lo que me sorprendió fue que en el .h, tuve:
Esto lleva a self.variableName y _variableName siendo dos variables distintas en el .m. Lo que necesitaba era:
Luego, en la clase '.m, self.variableName y _variableName son equivalentes.
Lo que aún no tengo claro es por qué muchos ejemplos todavía funcionan, incluso si esto no se hace.
Rayo
fuente
en lugar de guión bajo, puede usar el nombre self.variable o puede sintetizar la variable para usar la variable o la salida sin guión bajo.
fuente
Falta de las otras respuestas es que el uso le
_variable
impide escribir distraídamentevariable
y acceder al ivar en lugar de a la propiedad (supuestamente prevista).El compilador lo obligará a usar cualquiera
self.variable
o_variable
. El uso de guiones bajos hace que sea imposible escribirvariable
, lo que reduce los errores del programador.fuente