vikings vikingos ubbe temporada ragnarsson ragnar lothbrok lodbrok deshuesado björn objective-c objective-c-runtime

objective-c - ubbe - vikingos temporada 5



¿Cuál es el mecanismo subyacente para la síntesis de ivar en el tiempo de ejecución moderno de Objective C? (3)

Una de las características del tiempo de ejecución Objective C moderno (64 bits OS X e iPhone OS) es la capacidad de las propiedades para sintetizar dinámicamente ivars sin declararlas explícitamente en la clase:

@interface MyClass : NSObject { // NSString *name; unnecessary on modern runtimes } @property (retain) NSStrng *name; @end @implementation MyClass @synthesize name; @end

En gran parte de mi código utilizo implementaciones getter personalizadas para inicializar las propiedades:

- (NSString *) name { if (!name) { name = @"Louis"; } return name; }

Lo anterior es incompatible con ivars sintetizados ya que necesita acceder a un ivar que no está declarado en el encabezado. Por diversas razones, me gustaría actualizar varios de mis marcos personales para utilizar ivars sintetizados cuando se construyen en los tiempos de ejecución modernos, el código anterior debe modificarse para que funcione con ivars sintetizados con el fin de lograr ese objetivo.

Mientras que la documentación de Objective C 2.0 establece que los accesadores sintetizados en el tiempo de ejecución moderno sintetizarán el ivar en el primer uso. No especifica qué mecanismo de bajo nivel se usa para hacer esto. ¿Lo hace class_getInstanceVariable (), se han aflojado las restricciones en class_addIvar (), es una función no documentada en el tiempo de ejecución objetivo C 2.0? Si bien podría implementar mi propio almacenamiento lateral para los datos que respaldan mis propiedades, preferiría usar el mecanismo que utilizan los adaptadores sintetizados.


Fui y miré la documentación nuevamente, y creo que estás malinterpretando. Los ivars sintetizados se crean en tiempo de compilación, no en tiempo de ejecución.

De acuerdo con la documentación de Objective-C 2.0 :

Existen diferencias en el comportamiento que dependen del tiempo de ejecución (ver también "Diferencias de tiempo de ejecución"):

Para los tiempos de ejecución heredados, las variables de instancia ya deben declararse en el bloque @interface. Si existe una variable de instancia del mismo nombre y tipo compatible que la propiedad, se usa; de lo contrario, se obtiene un error de compilación.

Para los tiempos de ejecución modernos, las variables de instancia se sintetizan según sea necesario. Si ya existe una variable de instancia del mismo nombre, se usa.

Entonces, todo lo que necesita hacer es declarar la variable de instancia que necesita, y el mismo código funcionará en ambos tiempos de ejecución ...


Agregue propiedades en tiempo de ejecución con el NSKeyValueCoding Protocol .

[myObject setValue:@"whatever" forKey:@"foo"];


Lo que estás buscando es @synthesized name, como:

@synthesize name = _name; ... - (NSString *) name { if (!name) { _name = @"Louis"; } return _name; }