Создайте экземпляр объекта object-c по имени?

Можно ли создать экземпляр classа по имени? Что-то вроде:

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

Я не знаю, возможно ли это в объективе-c, но похоже, что это будет,

 id object = [[NSClassFromString(@"NameofClass") alloc] init]; 

NSClassFromString() запускает риск ошибочного использования имени classа или иным образом с использованием classа, который не существует. Если вы сделаете эту ошибку, вы не узнаете ее до выполнения. Вместо этого, если вы используете встроенный тип объектного типа c для создания переменной, тогда компилятор проверяет, существует ли class.

Например, в вашем .h :

 @property Class NameOfClass; 

а затем в вашем .m :

 id object = [[NameOfClass alloc] init]; 

Если вы ошибочно указали имя classа или если оно не существует, во время компиляции вы получите сообщение об ошибке. Также я думаю, что это более чистый код.

Если вы работаете с Objective-C без системы NeXTstep ( OS X , iOS , GNUstep т. Д.), Или вы просто думаете, что этот метод более чист, то вы можете использовать API-интерфейс библиотеки времени Objective-C . В Objective-C 2.0 :

 #import  //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  //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 ) для API 2.0 по сравнению the sum of two pointers (isa, cstring) , size_t length (cstring_length) и length of the string in bytes + 1 для API NeXTSTEP .

 @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]; 
  • Категории Objective-C в статической библиотеке
  • Как работает пул автозаполнения NSAutoreleasePool?
  • Переменные экземпляра, указанные в файле реализации ObjC
  • NSObject + load и + initialize - Что они делают?
  • Преобразовать десятичную дробную часть в Objective-C?
  • Как включить ARC для одного файла
  • Преобразование цели-c typedef в его эквивалент строки
  • Подclass UIView со своим XIB
  • Каков наилучший способ связи между controllerами?
  • Под автоматическим подсчетом ссылок, почему сохранить, освободить и dealloc не разрешено?
  • Когда следует использовать enumerateObjectsUsingBlock vs. for
  • Давайте будем гением компьютера.