Comment puis-je obtenir la classe Objective-C d’un ivar?

J’ai un tas de NSManagedObject simples NSManagedObject je crée dans un test unitaire. Ils ont juste un atsortingbut de name unique de type NSSsortingng * . Je donne toujours à NSManagedObject le même nom d’ entityName et le même nom de Class .

Je veux éviter d’avoir à écrire le code suivant 30 fois pour configurer un test unitaire:

 @interface FooTest : GHTestCase { Foo *foo; } @end @implementation FooTest - (void) setUp { [super setUp]; foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo" inManagedObjectContext:managedObjectContext]; foo.name = @"foo"; } @end 

Puisque foo est un ivar, je pense que je devrais être capable d’écrire une macro pour saisir le type de foo ( Foo ) et l’utiliser pour créer mon Foo :

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

Cependant, cela provoque l’avertissement suivant dans Clang:

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

J’ai également pensé pouvoir essayer de déterminer le type à l’aide de l’ IVar de l’objective-c à Ivar class_getInstanceVariable(Class cls, const char* name) , mais la seule information de type IVar disponible à partir du codage de type à partir de ivar_getTypeEncoding est id , qui n’est pas assez.

Quelqu’un peut-il penser à un moyen d’obtenir les informations de type d’un IVar au moment de la compilation ou de l’exécution?

    Je n’ai pas essayé d’obtenir les informations sur la classe d’un ivar, mais je sais que les déclarations @property codent des informations sur la classe. Par exemple, cette déclaration de propriété:

     @property (copy) NSSsortingng *normalSsortingng; 

    résulte dans cette chaîne d’atsortingbut (récupérée à l’aide de property_getAtsortingbutes () ) au moment de l’exécution:

     T@"NSSsortingng",C,VnormalSsortingng 

    J’ai écrit du code d’parsing open source pour cette information.

    Une fois que vous avez le nom de la classe, vous pouvez le convertir en un object de classe réel à l’aide de NSClassFromSsortingng () et envoyer le résultat à partir de là.

    Clause de non-responsabilité: il ne faut probablement pas compter sur cela pour les applications de production, car il est non documenté.

    Un id est un id . Au moment de l’exécution, tous les objects Objective-C ont le même type ( objc_object ). Ceci est lié à la nature dynamic d’ObjC. Par exemple, un object peut changer de classe à l’exécution, de nouvelles classes peuvent être créées et la hiérarchie des classes peut changer. Vous pouvez demander à une instance spécifique quel est son type (puisqu’il est stocké dans objc_object ), mais un pointeur sur un object est simplement un pointeur sur un object. Encore moins que cela: il s’agit en réalité d’un simple pointeur sur une structure C dont la mémoire supplémentaire est allouée à la fin (pour contenir les ivars de la sous-classe).

    Votre macro semble intéressante, mais vous devrez probablement passer le nom de la classe comme second paramètre plutôt que de le détecter automatiquement.

    Peut-être que je comprends mal ce que vous essayez d’atteindre. Pour obtenir la classe d’un iVar, ne pouvez-vous pas utiliser la méthode de classe de l’iVar?

    comme:

     NSSsortingng *aSsortingng = @"random ssortingng"; NSLog(@"%@",NSSsortingngFromClass([aSsortingng class]));