Я пытаюсь получить строковое имя класса из самого объекта класса.
// For instance
[NSArray className]; // @"NSArray"
Я нашел, object_getClassName(id obj)
но для этого требуется передать ему экземпляр, а в моем случае это ненужная работа.
Итак, как я могу получить строку из объекта класса, а не из экземпляра?
NSStringFromClass
реализовано? Более производительно хранить имя класса вstatic NSString
переменной?[NSArray class]
) на самом деле является файломstruct
.struct
Содержит много информации о классе, в том числе его название, методы он реализует, суперкласс и т.д.NSStringFromClass
просто тянет имя класса из этогоstruct
и преобразует его вNSString
. Не храните имя класса в astatic NSString
, это не даст никакого преимущества в производительности.NSClassFromString
работает немного иначе. Поскольку все имена классов существуют где-то в среде выполнения Objective-C,NSClassFromString
берет строку и исследует список классов, поддерживаемых средой выполнения, в поисках класса с заданным именем. Если он его находит, он его возвращает, иначе он возвращаетсяNil
.class_getName()
во время выполнения, который возвращает строку CclassName
это метод, добавленный расширениями сценариев, который доступен только в Mac OS X, даже в этом случае он привередлив в том, как он работает, потому что он не полностью документирован (или, по крайней мере, это был не последний раз, когда я проверял).NSStringFromClass()
это правильный способ сделать это.Вот другой способ сделать это с меньшим набором текста:
источник
+description
, однако теоретически это не цель+description
, и поэтому этот метод хрупкий для определения имен классов.Рассмотрим эту альтернативу:
Это намного быстрее, так как не нужно выделять объект NSString и преобразовывать ASCII в любое
NSString
представление. Вот какNSStringFromClass()
это реализовано.источник