objective c - @property y @synthesize en object-c
objective-c properties (2)
Mientras jugaba y descubrí cómo funcionan las cosas en https://github.com/enormego/EGOTableViewPullRefresh , encontré misterioso a @property y @synthesize. Aquí está el código que mencioné
EGORefreshTableHeaderView.h
@interface EGORefreshTableHeaderView : UIView {
id _delegate;
EGOPullRefreshState _state;
UILabel *_lastUpdatedLabel;
UILabel *_statusLabel;
CALayer *_arrowImage;
UIActivityIndicatorView *_activityView;
}
@property(nonatomic,assign) id <EGORefreshTableHeaderDelegate> delegate;
EGORefreshTableHeaderView.m
@synthesize delegate=_delegate;
He leído este http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html y por lo que entiendo es crear un nuevo nombre para _delegate que es delegado. (Estoy en lo cierto con este entendimiento?)
Pero todavía no entiendo por qué tienen que complicar las cosas con la directiva @synthesize =.
¿Qué tan complicado es, de verdad? Es solo un poco de sintaxis que le permite especificar el ivar que desea usar para respaldar la propiedad para la que le está diciendo al compilador que cree los accesores. Si no proporcionaron esto o algo equivalente, entonces siempre tendrá que hacer que los nombres de sus propiedades coincidan con los nombres de sus ivar, y hay razones por las que tal vez no lo desee.
Si no necesita nombrar sus ivars de manera diferente, entonces no tiene que molestarse en especificar el nombre de ivar. De hecho, no tiene que crear ivars para sus propiedades ... si no lo hace, el compilador los creará por usted.
Actualización: A mediados de 2013, LLVM utiliza de manera predeterminada la síntesis de los accesores para las propiedades, por lo que en la mayoría de los casos ya no es necesario especificar @synthesize
. El único caso en el que aún lo utilizarías es cuando deseas respaldar la propiedad con una variable de instancia diferente a la que el compilador generaría para ti. Además, el nombre predeterminado para el ivar que respalda una propiedad será el nombre de la propiedad prefijado con un guión bajo. Entonces, el código en el ejemplo del OP se podría simplificar eliminando las líneas:
id _delegate;
y:
@synthesize delegate=_delegate;
He quitado mis consejos anteriores contra el uso de un prefijo de subrayado, ya que está claramente en desacuerdo con la moda actual y el comportamiento predeterminado del compilador. Por lo que sé, sin embargo, todavía es una mala forma usar un prefijo de subrayado para los nombres de sus métodos.
Además, me ha llamado la atención que al menos una persona interpretó la primera línea de mi respuesta: "¿Qué tan complicado es en realidad?" Como condescendiente. Espero que haya sido solo la impresión de una persona; definitivamente no pretendía ser condescendiente, sino que solo estaba tratando de enmarcar mi respuesta en torno a la afirmación del OP de que @synthesize xxx=_xxx;
La directiva complica las cosas. Hay mucho que absorber cuando estás empezando; es de esperar que el nuevo comportamiento "sintetizar por defecto" reduzca la carga para los recién llegados.
Tienes razón, usando
@synthesize foobar=_foobar;
es un poco inútil en la mayoría de los casos, pero a un nivel abstracto le permite devolver el valor de alguna otra variable por completo. Como en ...
@synthesize foobar=fluffybunny;
Le permite obtener o establecer el valor de fluffybunny
cada vez que usa el .foobar
acceso .foobar
Sin embargo, en términos de la complejidad de @synthesize
, preferiría escribir
-(void)setFoobar:(id)aobject {
[self willSetValueForKey:"foobar"];
id old = foobar;
foobar = [aobject retain];
[old release];
[self didSetValueForKey:"foobar"];
}
-(id)foobar {
[self willAccessValueForKey:"foobar"];
id obj = [self primitiveValueForKey:@"foobar"];
[self didAccessValueForKey:"foobar"];
return obj;
}
O
@synthesize foobar;
Eso no está particularmente bien escrito, ya que he olvidado cómo hacerlo bien, pero la directiva @synthesize evita que tengas que escribir accesores tantas veces. Es una de las cosas que chupó más sobre Obj-C 1.0.
Código libre, no lo golpees.