Una propiedad Objective-C generalmente tiene una variable de instancia de respaldo (supongo que conoce la diferencia entre una propiedad y una variable de instancia).
La propiedad puede tener un nombre diferente al de la variable de instancia.
Por ejemplo, puede tener una variable de instancia llamada x
, con una propiedad llamada y
.
Usted puede sintetizar la propiedad y
a la variable x
usando:
@synthesize y = x;
Ahora sobre el guión.
Es una práctica común usar un prefijo de guión bajo para variables de instancia, para evitar colisiones de nombres o advertencias de compilador (variable sombreada) cuando se tiene por ejemplo un argumento de método con el mismo nombre que una variable de instancia.
El prefijo de subrayado también deja en claro que se refiere a una variable de instancia.
Al utilizar el prefijo de subrayado para las variables de instancia, usted es libre de utilizar el nombre sin el subrayado en los argumentos del método, las variables de pila, etc.
Pero cuando se utiliza una propiedad, por lo general no desea que el usuario para escribir un guion bajo
Por lo tanto, normalmente tiene una propiedad x
para una variable de instancia _x
.
Esto es por lo que escribe:
@synthesize x = _x;
Tomemos un ejemplo:
@interface Test: NSObject
{
int x;
}
@property(readonly) int x;
@end
Esto es bastante común ...Pero ahora imagine esto en la implementación:
- (id)initWithX: (int)x
{}
Tenemos una colisión de nombres.
Dentro de nuestro método, x
se referirá al argumento del método. Y no hay una manera bonita de acceder a la variable de instancia x
.
Dependiendo de las banderas de advertencia de su compilador, esto también puede generar una advertencia (-Wshadow
).
Si utiliza un prefijo de guión para su variable de instancia, todo es simple:
- (id)initWithX: (int)x
{
if((self = [ super init ]))
{
_x = x;
}
return self;
}
No hay ningún conflicto, ninguna colisión de nombres, mejoramiento de la lectura ... Sólo una buena manera ...
Hay muchos, muchos duplicados de esta pregunta: [1] (http://stackoverflow.com/questions/3521254/) [2] (http://stackoverflow.com/questions/822487/) [3] (http://stackoverflow.com/questions/2371489) [4] (http://stackoverflow.com/questions/5582448/) [5] (http://stackoverflow.com/questions/837559/) [6] (http://stackoverflow.com/questions/6064283 /) [y más ...] (http://stackoverflow.com/search?q=objc+property+underscore) –