¿Cuál es el mecanismo subyacente para la síntesis de ivar en el tiempo de ejecución moderno del Objetivo C?
Una de las características del moderno tiempo de ejecución de Objective C (64 bits OS X y iPhone OS) es la capacidad de las propiedades para sintetizar dinámicamente los ivars sin declararlos 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 bastante de mi código uso implementaciones de captador personalizadas para inicializar las propiedades:
- (NSString *) name {
if (!name) {
name = @"Louis";
}
return name;
}
Lo anterior es incompatible con los ivars sintetizados ya que necesita acceder a un ivar que no está declarado en el encabezado. Por varias razones, me gustaría actualizar algunos de mis marcos personales para usar ivars sintetizados cuando se construyen en los tiempos de ejecución modernos, el código anterior debe modificarse para que funcione con ivars sintetizados para lograr ese objetivo.
Mientras que la documentación del Objetivo C 2.0 establece que los accesos sintetizados en el tiempo de ejecución moderno sintetizarán el ivar en el primer uso. No especifica qué mecanismo de bajo nivel se utiliza para hacer esto. ¿Se hace mediante class_getInstanceVariable (), se aflojan las restricciones en class_addIvar (), es una función no documentada en el tiempo de ejecución objetivo de C 2.0? Si bien podría implementar mi propio almacenamiento lateral para los datos que respaldan mis propiedades, preferiría utilizar el mecanismo que utilizan los accesos sintetizados.