Можно ли создать экземпляр класса по имени? Что-то вроде:
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
Я не знаю, возможно ли это в objective-c, но похоже, что это было бы,
objective-c
reflection
отметка
источник
источник
NSClassFromString()
рискует ошибиться при вводе имени класса или иным образом использовать несуществующий класс. Вы не узнаете до времени выполнения, если сделаете эту ошибку. Вместо этого, если вы используете встроенный тип objective-cClass
для создания переменной, компилятор проверит, существует ли класс.Например, в вашем
.h
:а затем в вашем
.m
:Если вы неправильно набрали имя класса или он не существует, вы получите ошибку во время компиляции. Также я думаю, что это более чистый код.
источник
Если вы работаете с Objective-C без системы
NeXTstep
(OS X
,iOS
иGNUstep
т. Д.) Или просто думаете, что этот метод чище, то вы можете использовать API библиотеки времени выполнения языка Objective-C . ПодObjective-C 2.0
:В Objective-C (1.0 или безымянная версия) вы должны использовать следующее:
Я не тестировал
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)
asize_t length (cstring_length)
иlength of the string in bytes + 1
дляNeXTSTEP
API.источник
Затем использовать:
источник