Я понимаю, что класс на самом деле является объектом / typedef структуры (objc_class*)
. Каждый класс имеет «поддерживающий» метакласс, который, в свою очередь, имеет указатель isa, указывающий на метакласс NSObject
.
И NSObject
в основном имеет указатель isa, указывающий на себя.
И мы могли бы получить доступ к метаклассу через эту строку:
objc_getMetaClass("<CLASS_NAME>");
Я надеюсь, что мое понимание метакласса здесь еще не упущено (пожалуйста, поправьте меня, если это так).
Мои вопросы:
1.)
Когда нам нужно иметь дело с метаклассом? Не могли бы вы привести пример/сценарий в коде, когда нам это может понадобиться?
2.)
Предыстория:
Я свободно думал о сторонних библиотеках и о том, как они структурированы.
Обычно они предоставляют вам метод класса и возвращают вам класс, а все остальные методы являются закрытыми/скрытыми. И в большинстве случаев, хотя они могут быть подклассами, но, поскольку мы не знаем метод init
, было бы бесполезно создавать подклассы.
И вдруг я начал думать о категории Objective-C, что привело меня к мысли о метаклассе Objective-C.
И это приводит к моему вопросу № 2:
Можно ли сломать эту структуру, используя категорию Objective-C и/или используя метакласс (взяв его и вставив метод класса прям там в мета классе)? Или даже посмотреть имя их методов экземпляра, которые являются закрытыми?
Мое намерение здесь состоит не в том, чтобы что-то «сломать», мне просто очень любопытно, насколько «нерушимы» эти сторонние библиотеки, и нельзя ли их структуры «сломать» с помощью Category и Метакласс.
@Лео Натан:
1.)
Что такое method_*()
?
2.)
Из любви к среде выполнения Objective-C:
Не могли бы вы привести пример реализации метода экземпляра, скажем,
(Я не уверен, что этот метод является хорошим примером, потому что мы могли бы переопределить его в первую очередь)
Метод экземпляра NSArray
-count
(давайте сделаем так, чтобы он всегда возвращал значение 100, например)
3.)
Итак, теоретически все классы (включая все сторонние библиотеки) могут быть сломаны (сломаны)? Другими словами, нельзя создать API/библиотеку типа "вызов-только-этот-класс-метод-или-вы-не-можете-использовать-меня"?
Большое спасибо.