¿Cómo obtengo la clase Objective-C de un ivar?

Tengo un montón de simplesNSManagedObjects creo en una prueba unitaria. Solo tienen unaname atributo de tipoNSString *. Siempre doy miNSManagedObject lo mismoentityName yClass nombre.

Quiero evitar tener que escribir el siguiente código 30 veces para configurar una prueba de unidad:

@interface FooTest : GHTestCase {
Foo *foo;
}
@end
@implementation FooTest

- (void) setUp {
  [super setUp];

  foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
                                      inManagedObjectContext:managedObjectContext];
  foo.name = @"foo";
}
@end

Ya quefoo es un ivar, creo que debería poder escribir una macro para capturar el tipo defoo (Foo), y utilizar para crear miFoo:

#define InsertManagedObjectByVariable(variable) \
do { \
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])]; \
variable.name = (NSString *) CFSTR(#variable);
} while(0)

Sin embargo, esto provoca la siguiente advertencia en clang:

variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])];
                                                                               ^
                                                             Expected expression

También pensé que podía intentar determinar el tipo utilizando el tiempo de ejecución de object-cIVar desdeIvar class_getInstanceVariable(Class cls, const char* name), pero el únicoIVar información de tipo disponible a partir de la codificación de tipo deivar_getTypeEncoding esid, que no es suficiente.

¿Puede alguien pensar en una manera de obtener la información de tipo de unIVar ya sea en tiempo de compilación o en tiempo de ejecución?

Respuestas a la pregunta(3)

Su respuesta a la pregunta