Wie bekomme ich die Objective-C-Klasse eines Ivars?

Ich habe ein paar einfacheNSManagedObjects erstelle ich in einem Unit-Test. Sie haben nur eine einzigename Attribut des TypsNSString *. Ich gebe immer meineNSManagedObject das GleicheentityName undClass Name.

Ich möchte vermeiden, den folgenden Code 30 Mal schreiben zu müssen, um einen Komponententest einzurichten:

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

- (void) setUp {
  [super setUp];

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

Schon seitfoo ist ein ivar, ich würde denken, ich sollte in der Lage sein, ein Makro zu schreiben, um die Art von zu greifenfoo (Foo) und zum Erstellen von myFoo:

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

Dies verursacht jedoch die folgende Warnung:

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

Ich dachte auch, ich könnte versuchen, den Typ mithilfe der object-c-Laufzeit zu bestimmenIVar vonIvar class_getInstanceVariable(Class cls, const char* name), aber das einzigeIVar Typinformationen verfügbar aus der Typcodierung vonivar_getTypeEncoding istid, was nicht reicht.

Kann sich jemand einen Weg überlegen, um die Typinformationen einesIVar entweder zur Kompilierungszeit oder zur Laufzeit?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage