IOS/Objective-C: правильный способ получения объекта метакласса

Какое из следующего является правильным способом получения метакласса?

Class myMetaClass = objc_getMetaClass("NSString");

Или:

Class myMetaClass = object_getClass([NSString class]);
  • Они оба разные?

  • Как упоминалось в другом сообщении, которое связано с первым ответчиком здесь:

Скажите, пожалуйста, почему (????) objc_getMetaClass(); в <случаях > сломать.

  • Правильный способ использовать их в разных сценариях.

Спасибо.

Ответ 1

Обе функции верны, но objc_getMetaClass("NSString") работает только в том случае, если NSString зарегистрирована в целевой среде выполнения C. Это почти всегда, если вы хотите получить свой метакласс.

Но если вы создаете класс, используя Class myClass = objc_allocateClassPair(superClass,"my_own_class",0), ситуация немного отличается.

my_own_class еще не зарегистрирован, поэтому, если вам нужно получить доступ к метаклассу (чтобы добавить методы класса), вы должны использовать object_getClass(myClass). objc_getMetaClass("my_own_class") вернет nil.

Ответ 2

Разница в том, что вторая функция возвращает объект для именованного класса, а второй сначала - объект для метакласса именованного класса...:)

Оба они вызывают обратный вызов обработчика класса, если класс не зарегистрирован для проверки во второй раз. Когда вы вызываете функцию метакласса, вы получите результат возврата.

... (Однако каждое определение класса должно иметь действительный метакласс определение, и поэтому определение метакласса всегда возвращается, независимо от того, действительны они или нет.) от: Objective-C Справочник по времени выполнения

Я думаю, что ваш реальный вопрос: В чем разница между классом и метаклассом? Пожалуйста, ознакомьтесь с этим отличным объяснением: Что такое метакласс в objective-c