iphone - programacion - ¿Cuándo haces un guión bajo frente a una variable de instancia?
programacion orientada a objetos python pdf (8)
Posible duplicado:
¿Cómo funciona un guión bajo al frente de una variable en una clase de cacao objetivo-c?
Lo he visto en Apple, dentro de UIPickerView.h:
id<UIPickerViewDataSource> _dataSource;
¿Por qué ese guión bajo? ¿Tiene un significado especial? ¿Una convención de la que debo saber?
A veces se usa para denotar variables privadas. De manera más general, solo significa que "esta variable es diferente de alguna manera".
Como ya se dijo, algunos Vare solían decir que una variable era privada. Era una simple cuestión de convención y realmente no importa.
Otro uso, realizar un viaje en la máquina de retorno en C a _function () representaba una función que no era portátil en la plataforma y __function () representaba una función que no era portable para el compilador. Por lo tanto, en la biblioteca C estándar, a veces verá una variable con un _ o __ enfrente del nombre, esto es lo que representan esas funciones.
Elijo usar guiones bajos para ivars porque a menudo me encuentro con la siguiente situación:
@interface MyClass:NSObject
{
NSUInteger count;
}
@property(nonatomic) NSUInteger count;
-(id) initWithCount(NSUInteger) count;
@end
(...)
@implementation MyClass
@synthesize count;
-(id) initWithCount(NSUInteger) count
{
if((self = [super init])){
self.count = count; // Parameter name collides with ivar name!
}
return self;
}
@end
Entonces hago esto:
@interface MyClass:NSObject
{
NSUInteger _count;
}
@property(nonatomic) NSUInteger count;
-(id) initWithCount(NSUInteger) count;
@end
(...)
@implementation MyClass
@synthesize count = _count;
-(id) initWithCount(NSUInteger) count
{
if((self = [super init])){
_count = count; // No name collision
}
return self;
}
@end
Por supuesto, podría cambiar alternativamente el nombre del parámetro a "newCount" o "aCount" (odio ese). Creo que es una cuestión de gusto.
En general, se trata de indicar que una variable no debe ser tocada directamente por un desarrollador. No es realmente un requisito, pero es una buena práctica si no puede evitar tener una variable pública en una clase que no le moleste.
Lo que está viendo es el uso de subrayados para distinguir entre variables de instancia y propiedades. Entonces una declaración de clase podría ser:
@interface Foo {
NSString* _label;
....
}
@property (nonatomic, retain) NSString* label; // notice: no underline
Luego, en el archivo de implementación, tendrías:
@synthesize label=_label; // the property is matched with the ivar
Ahora, cuando se encuentre dentro de la implementación, si desea acceder directamente a la variable de instancia, simplemente podría usar _label
pero para ir a través de los métodos de acceso a la propiedad (que se encargan de retener / versiones y un montón de otras tareas de contabilidad) usaría self.label
. Desde el exterior, siempre desearía ir a través de la propiedad {object}.label
.
La otra forma es prescindir del subrayado y solo usar:
NSString* label;
@property (nonatomic, retain) NSString* label;
...
@synthesize label;
Funciona igual, pero puede confundir a alguien que lee el código e intenta hacer un seguimiento de la label
vs self.label
. Personalmente encuentro que la convención de Apple (con subrayados) es un poco más fácil de leer, pero es una cuestión de preferencia.
Mucha gente usa esto para variables privadas, para diferenciar entre variables privadas y variables públicas dentro de un objeto.
Es una forma completamente opcional de trabajar.
Utilizo guiones bajos para indicar que una variable es un miembro, similar al prefijo ''m'' en la notación húngara (cuya notación desprecio a fondo, pero esa es otra historia). Seguro que tienes editores de códigos de colores estos días, pero mi opinión es que el prefijo te hace pensar que la variable es miembro / instancia antes de que la escribas, no solo en algún momento después cuando el editor de colores la codifica por colores.
puede ser eso ... (memoria de trote) ...
Recuerdo vagamente haber leído un documento de ADC que explicaba que Apple se reserva el uso de las variables de miembro con guión bajo. y que se desaconseja a los desarrolladores de terceros utilizar esta convención para evitar colisiones.
| K <