¿Cuál es el mecanismo subyacente para la síntesis de ivar en el tiempo de ejecución moderno del Objetivo C?

StackOverflow https://stackoverflow.com/questions/275034

  •  07-07-2019
  •  | 
  •  

Pregunta

Una de las características del tiempo de ejecución moderno de Objective C (64 bits OS X y iPhone OS) es la capacidad de las propiedades para sintetizar dinámicamente 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 ivars sintetizados ya que necesita acceder a un ivar que no se declara 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.

¿Fue útil?

Solución

Fui y volví a mirar la documentación en este momento, y creo que la estás leyendo mal. 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 (consulte 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 con el mismo nombre y tipo compatible que la propiedad, se usa; de lo contrario, se obtiene un error del compilador.

     

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

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 ...

Otros consejos

Lo que está buscando es el nombre @ sintetizado, como:

@synthesize name = _name;

...

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

    return _name;
}

Agrega propiedades en tiempo de ejecución con Protocolo NSKeyValueCoding .

[myObject setValue:@"whatever" forKey:@"foo"];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top