Как категории реализуются в Задаче C? - PullRequest
7 голосов
/ 11 августа 2011

Я знаю, как использовать категории в качестве программиста, но мне любопытно, как они реализованы. Компилятор компилирует их в вызовы class_replaceMethod из статического инициализатора? Спасибо.

Ответы [ 3 ]

9 голосов
/ 11 августа 2011

Новый ответ по теме.

У каждого класса есть список методов, при поиске методов список методов сканируется от начала до конца. Если метод не найден, список суперкласса сканируется и т. Д. До достижения корневого класса. Найденные методы кэшируются для более быстрого поиска в следующий раз.

При загрузке категории в класс список методов категорий добавляется к существующему списку, и кэши сбрасываются. Поскольку список ищется последовательно, это означает, что метод категорий будет найден за до исходного метода при следующем поиске.

Эта настройка категорий выполняется лениво из статических данных при первом обращении к классу. И может быть сделано заново при загрузке пакета с исполняемым кодом.

Короче, это немного более низкий уровень, чем class_replaceMethod().

3 голосов
/ 11 августа 2011

Здесь вы можете найти все, что вы хотели знать о том, как они работают.

http://opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-runtime-new.mm

Среда выполнения полностью открыта.

0 голосов
/ 11 августа 2011

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

Протоколы действуют как маркеры для классов во время выполнения.Вы можете использовать class_copyProtocolList(), чтобы получить список протоколов, которым класс соответствует из среды выполнения.Существует функция protocol_copyProtocolList() для получения протокола, которому соответствует протокол.

Обратите внимание, что эти методы возвращают только список протоколов для этого конкретного класса или протокола.Не из суперклассов или других протоколов по ссылке.Это означает, что фактический поиск во время выполнения будет дорогим.Вместо этого используйте class_conformsToProtocol() (или protocol_conformsToProtocol()) для запроса соответствия, эти методы могут кэшировать результат.

На практике запросы на соответствие во время выполнения редко бывают полезными.Соответствие протокола подтверждается предупреждениями компилятора, если разработчик решает игнорировать эти предупреждения, что ж ... это их выбор.

...