Risposte:
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
corre il rischio di digitare in modo errato il nome della classe o altrimenti di utilizzare una classe che non esiste. Non lo scoprirai fino al runtime se commetti quell'errore. Se invece utilizzi il tipo di object-c incorporato Class
per creare una variabile, il compilatore verificherà che la classe esista.
Ad esempio, nel tuo .h
:
@property Class NameOfClass;
e poi nel tuo .m
:
id object = [[NameOfClass alloc] init];
Se hai digitato male il nome della classe o se non esiste, riceverai un errore in fase di compilazione. Inoltre penso che questo sia un codice più pulito.
Se si lavora con Objective-C, senza la NeXTstep
( OS X
, iOS
, GNUstep
sistema ecc) o semplicemente pensi che questo metodo è più pulita, allora si potrebbe utilizzare l' API di libreria di runtime linguaggio Objective-C . Sotto 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 ];
Sotto Objective-C (1.0 o versione senza nome) utilizzeresti quanto segue:
#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 ];
Non ho testato la 1.0
versione, tuttavia ho utilizzato la 2.0
funzione nel codice che è ora in produzione. Personalmente ritengo che l'utilizzo della 2.0
funzione sia più pulito se disponibile rispetto alla funzione NS in quanto consuma meno spazio: the length of the name in bytes + 1 ( null terminator )
per l'API 2.0 rispetto the sum of two pointers (isa, cstring)
a size_t length (cstring_length)
, a e length of the string in bytes + 1
per l' NeXTSTEP
API.