Es realmente muy útil, pero la mayoría de la gente no sabe por qué, y eso es una vergüenza. Apple usa guiones bajos para separar la manera en que otros objetos acceden a las variables de un objeto en particular, y la forma en que un objeto en particular accede a sus propias variables. Ahora bien, esto puede sonar un poco extraño, pero imagina lo siguiente: Es probable que todos reconocen el siguiente compilador de advertencia
.h
@property (nonatomic, retain, readonly) UITableView *tableView;
.m
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self loadSomethingElseForTableView:tableView];
}
Esto dará lugar a una advertencia del compilador, ya que no sabe ya sea que se hace referencia a la variable local "tableView", o la variable de instancia. Por lo tanto, Apple recomienda agregar lo siguiente a la parte superior de su @implementation.
@synthesize tableView = _tableView;
Ahora, cuando se hace referencia a _tableView
, el compilador sabe que quiere decir la variable de instancia, y no con la local.
Además, esto hace que sea mucho más fácil comprender la recolección de basura en Obj-C y evitar cometer errores comunes.
Por ejemplo, cuando se hace lo siguiente:
@property (nonatomic, retain, readonly) NSString *title;
- (id)initWithTitle:(NSString *)title {
if ((self = [super init])) {
self.title = title; // Is not possible, since it's read only.
title = title; // Is not possible, since it's the same (local) variable.
// Changing the method to initWithTitle:(NSString *)aTitle;
title = aTitle;
}
return self;
}
Ahora, puesto que no se utiliza la incubadora por defecto (en realidad, no se puede, porque es de sólo lectura) que necesidad para retener el variable usted mismo. Esto es mucho más fácil de recordar cuando le da un prefijo a cada variable de instancia (para que sepa que necesita retenerlo usted mismo). Por lo tanto, básicamente, es importante comprender la diferencia entre self.variable
y (_
) variable
. (Es decir: self.variable
mapas a [self setVariable:...]
y variable
Se correlaciona directamente con el puntero del
Por otra parte, cuando se agrega como una variable privada, así:.
@interface TSSomeObject : NSObject {
@private
NSString *_privateTitle;
}
@end
El prefijo de subrayado no es realmente necesario, a menos que pueda encontrar variables locales que tengan el mismo nombre. Además, también es una manera fácil de recordarle que es un puntero local y que necesita retener (y liberar) la variable cuando la asigna a su objeto.
Lo es equivocada es la creación de una propiedad con un prefijo de subrayado, así:
@property (nonatomic, retain) NSString *_title;
Eso es realmente mal, y no estoy siquiera va a explicar por qué;)
Así que sí! ¡Deberías usar prefijos de subrayado, hace que tu código sea mucho más fácil de leer e interpretar por el compilador! En Xcode 4, Apple incluso agregó estos @synthesize
a las plantillas predeterminadas.
O estática en C. –