Es posible acceder al ivar directamente, con el mismo nombre que la propiedad sintetizada. La directiva @synthesize
crea el ivar en su nombre si uno no existe ya, y dado que es una directiva de compilación, el ivar está disponible en tiempo de compilación. Consulte "Runtime Difference" en el capítulo Propiedades declaradas de El lenguaje de programación Objective-C. Como señaló Abizern en un comentario, también es posible especificar el nombre que desee para el ivar: @synthesize coffee=tea;
- aquí, tea
es el ivar y coffee
de la propiedad.
Para usar el ivar, simplemente consúltelo como cualquier otra variable, sin usar la sintaxis de punto. El siguiente es perfectamente legal y funciona como se esperaba:
@interface Grisby : NSObject {}
@property (retain) NSObject * obj;
@end
@implementation Grisby
@synthesize obj;
- (void) dealloc {
[obj release], obj = nil;
[super dealloc];
}
- (id) init {
self = [super init];
if(!self) return nil;
obj = [NSObject new];
return self;
}
- (NSObject *) obj {
return [[obj retain] autorelease];
}
@end
el "tiempo de ejecución moderna" se introdujo con Mac OS X 10.5 (Leopard) como parte de la transición a 64 bits. Todas las versiones de iOS usan el tiempo de ejecución moderno. Las variables de instancia sintetizadas son una característica del tiempo de ejecución moderno, como se indica en el enlace que proporcioné anteriormente.
La otra diferencia clave, noted in "Runtime Versions and Platforms" de la Guía de programación de tiempo de ejecución de Objective-C, es que las variables de instancia son "no frágiles". Hay una capa de indirección agregada al almacenamiento y acceso de ivar que permite a las clases agregar variables sin afectar el almacenamiento de las clases derivadas. También presumiblemente facilita la síntesis de variable de instancia. Greg Parker has an explanation que involucra gatitos, hay referencias pasajeras en Mike Ash's 2009 runtime writeup, y Bavarious aquí en SO tiene un swell post sobre el almacenamiento de ivar y las extensiones de clase.
Puede ver otras cosas que han cambiado, aunque sin explicación, en el capítulo "Mac OS X Version 10.5 Delta" de la Referencia de tiempo de ejecución de Objective-C.
Posiblemente relacionado: http://stackoverflow.com/questions/5621139/is-there-any-problem-using-self-property-nil-in-dealloc –
No hay respuesta en ese post para lo que es "moderno" tiempo de ejecución ". – Pablo
Ese bit "no se puede acceder directamente a la variable de instancia" solía ser el caso con compiladores anteriores. Con compiladores suficientemente modernos, puede acceder a la variable de instancia de respaldo que se sintetizó automáticamente para una propiedad declarada. –