95 votes

Créer une instance de classe objective-c par son nom?

Est-il possible de créer une instance d'une classe par son nom? Quelque chose comme:

 NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
 

Je ne sais pas si cela est possible dans objectif-c mais cela semble être le cas,

217voto

Chris McCall Points 5350
id object = [[NSClassFromString(@"NameofClass") alloc] init];

39voto

sbwoodside Points 3860

NSClassFromString() court le risque d'erreur de frappe le nom de la classe ou autrement, à l'aide d'une classe qui n'existe pas. Vous ne trouverez pas jusqu'à ce que l'exécution si vous faites cette erreur. Au lieu de cela, si vous utilisez le pare-en objective-c type d' Class pour créer une variable, alors le compilateur vérifie que la classe existe.

Par exemple, dans votre .h:

@property Class NameOfClass;

et puis dans votre .m:

id object = [[NameOfClass alloc] init];

Si vous avez mal orthographié le nom de la classe ou s'il n'existe pas, vous recevrez un message d'erreur au moment de la compilation. Aussi je pense que c'est plus propre code.

8voto

Mark Points 61

Si vous travaillez avec Objective-C sans l' NeXTstep (OS X, iOS, GNUstep etc) ou vous pense juste que cette méthode est plus propre, alors vous pourriez utiliser l' Objective-C langue de la bibliothèque d'exécution de l'API. En vertu de l' Objective-C 2.0:

#import <objc/runtime.h>
//Declaration in the above named file
id objc_getClass(const char* name);
//Usage
id c = objc_getClass("Object");
[ [ c alloc ] free ];

En vertu de l'Objective-C (1.0 ou sans nom, version) vous serait d'utiliser les éléments suivants:

#import <objc/objc-api.h>
//Declaration within the above named file
Class objc_get_class( const char* name);
//Usage
Class cls = objc_get_class( "Test" );
id obj = class_create_instance( cls );
[ obj free ];

Je n'ai pas testé l' 1.0 version, toutefois, j'ai utilisé l' 2.0 de la fonction dans le code qui est maintenant en production. Je crois personnellement en utilisant l' 2.0 fonction est plus propre si disponibles, que NS la fonction qu'il consomme moins d'espace: the length of the name in bytes + 1 ( null terminator ) pour l'API 2.0 versus the sum of two pointers (isa, cstring), size_t length (cstring_length), et l' length of the string in bytes + 1 de la NeXTSTEP API.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X