Відповіді:
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()ризикує помилково ввести назву класу або іншим чином використовувати клас, який не існує. Ви не дізнаєтесь до часу виконання, якщо зробите цю помилку. Натомість, якщо ви використовуєте вбудований тип-c типу Classдля створення змінної, то компілятор перевірить наявність класу.
Наприклад, у вашому .h:
@property Class NameOfClass;
а потім у вашому .m:
id object = [[NameOfClass alloc] init];
Якщо ви неправильно ввели назву класу або якщо вона не існує, ви отримаєте помилку під час компіляції. Також я думаю, що це чистіший код.
Якщо ви працюєте з Objective-C без NeXTstep( OS X, iOS, і GNUstepт.д.) в системі або ви просто думаєте , що цей метод є більш чистим, то ви можете використовувати API Мови по Objective-C у час виконання бібліотеки . Під 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 ];
Під Objective-C (1.0 або неназвана версія) ви будете використовувати наступне:
#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 ];
Я не тестував 1.0версію, однак використовував 2.0функцію в коді, який зараз виготовляється. Я особисто вважаю , використовуючи 2.0функцію чистіше , якщо така є , ніж функція NS , як вона займає менше місця: the length of the name in bytes + 1 ( null terminator )для 2.0 API в порівнянні the sum of two pointers (isa, cstring), size_t length (cstring_length), а length of the string in bytes + 1для NeXTSTEPAPI.
@interface Magic : NSObject
+ (id)createInstanceOfClass:(Class)classe;
@end
@implementation Magic
+ (id)createInstanceOfClass:(Class)classe
{
return [[classe alloc] init];
}
@end
Потім, щоб використовувати його:
Car *car = [Magic createInstanceOfClass:[Car class]];
[car engineTurnOn];