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 objective-c mais il semble que ce serait le cas,
objective-c
reflection
marque
la source
la source
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
:puis dans votre
.m
: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.
la source
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 . SousObjective-C 2.0
:Sous Objective-C (version 1.0 ou sans nom), vous utiliseriez ce qui suit:
Je n'ai pas testé la
1.0
version, cependant j'ai utilisé la2.0
fonction dans le code qui est maintenant en production. Personnellement, je pense que l'utilisation de la2.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)
, asize_t length (cstring_length)
etlength of the string in bytes + 1
pour l'NeXTSTEP
API.la source
Alors pour l'utiliser:
la source