¿Cuándo debo agregar @synthesize
explícitamente a mi código?
Generalmente, si es necesario: Probablemente nunca encontrará un caso donde sea necesario.
Sin embargo, hay un caso que puede resultarle útil.
Supongamos que está escribiendo tanto un getter como un setter personalizados, pero desea que una variable de instancia lo respalde. (Para una propiedad atómica, esto es tan simple como querer un setter personalizado: el compilador escribirá un getter si especificas un setter para una propiedad monoatómica, pero no una propiedad atómica).
Considera esto:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Esto no funcionará porque _title
no existe. Ha especificado tanto un getter como un setter, por lo que Xcode (correctamente) no crea una variable de instancia de respaldo para él.
Tienes dos opciones para hacerlo existir. Puede cambiar el@implementation
a esto:
@implementation MyObject {
NSString *_title;
}
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
O cámbielo a esto:
@implementation MyObject
@synthesize title = _title;
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
En otras palabras, aunque sintetizar nunca es necesario para fines prácticos *, se puede utilizar para definir variables de instancia de respaldo de propiedad cuando se proporciona un captador / definidor. Aquí puede decidir qué formulario desea utilizar.
En el pasado, prefería especificar la variable de instancia en el @implementation {}
, pero ahora creo que@synthesize
ruta es una mejor opción, ya que elimina el tipo redundante y vincula explícitamente la variable de respaldo a la propiedad:
- Cambie el tipo de propiedad y el tipo de variable de instancia cambia.
- Cambie su calificador de almacenamiento (por ejemplo, hágalo débil en lugar de fuerte o fuerte en lugar de débil) y el calificador de almacenamiento cambia.
- Elimine o cambie el nombre de la propiedad y
@synthesize
generará un error del compilador. No acabará con variables de instancia extraviadas.
* -Conozco un caso en el que fue necesario, relacionado con la división de funciones en categorías en varios archivos. Y no me sorprendería si Apple soluciona esto, o incluso si ya lo ha hecho.