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

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

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

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

4 Solutions collect form web for “Создайте экземпляр объекта object-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]; 
  • Пользовательский блок завершения для моего собственного метода
  • Обработка вопросов собственности на указатель-указатель в ARC
  • Слабая переменная NSString не равна нулю после установки единственной сильной ссылки на nil
  • Категории Objective-C в статической библиотеке
  • Преобразование RGB-данных в bitmap в Objective-C ++ Cocoa
  • Некоторые вопросы об автоматическом подсчете ссылок в iOS5 SDK
  • Разница iPhone SDK между isKindOfClass и isMemberOfClass
  • objective-C: BOOL vs bool
  • Когда следует использовать enumerateObjectsUsingBlock vs. for
  • Кодировать NSString для XML / HTML
  • Возвращаемое значение для функции внутри блока
  • Давайте будем гением компьютера.