Réponses:
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
court le risque de mal saisir le nom de la classe ou d'utiliser autrement une classe qui n'existe pas. Vous ne saurez pas avant l'exécution si vous faites cette erreur. Au lieu de cela, si vous utilisez le type objectif-c intégré Class
pour créer une variable, le compilateur vérifiera que la classe existe.
Par exemple, dans votre .h
:
@property Class NameOfClass;
puis dans votre .m
:
id object = [[NameOfClass alloc] init];
Si vous avez mal saisi le nom de la classe ou s'il n'existe pas, vous obtiendrez une erreur lors de la compilation. Je pense aussi que c'est un code plus propre.
Si vous travaillez avec Objective-C sans NeXTstep
( OS X
, iOS
, GNUstep
etc.) ou système vous pensez que cette méthode est plus propre, vous pouvez utiliser l' API de bibliothèque d'exécution de langage Objective-C . Sous 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 ];
Sous Objective-C (version 1.0 ou sans nom), vous utiliseriez ce qui suit:
#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é la 1.0
version, cependant j'ai utilisé la 2.0
fonction dans le code qui est maintenant en production. Personnellement, je pense que l'utilisation de la 2.0
fonction est plus propre si elle est disponible que la fonction NS car elle consomme moins d'espace: the length of the name in bytes + 1 ( null terminator )
pour l'API 2.0 par rapport à the sum of two pointers (isa, cstring)
, a size_t length (cstring_length)
et length of the string in bytes + 1
pour l' NeXTSTEP
API.