Этот вопрос вне чистого любопытства. Как Какао определяет идентификационный тип? Это - просто определение типа для пустоты *? Кроме того, если Вы знаете, в каком заголовочном файле это определяется, я интересовался бы взглядом.
Удерживая клавишу управления, дважды щелкните по любому выделенному термину, чтобы перейти к его определению.
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
typedef struct objc_selector *SEL;
typedef id (*IMP)(id, SEL, ...);
В /usr/include/objc/objc.h
(о Leopard) это выглядит следующим образом:
typedef struct objc_object {
Class isa;
} *id;
Что означает, что это вовсе не пустота *
, а указатель на структуру, которая содержит один член, указывающий на определение класса. Действительно интересно.
Помню, когда я только заходил в Си и узнал, что Objective-C изначально была реализована в виде слоя препроцессора поверх C. Это уже не совсем так.
Лучшее чтение по найденной мною теме:
в объекте objc.h
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Чтобы самостоятельно узнать в XCode, щелкните правой кнопкой мыши на id -- или любом другом типе -- и выберите и перейдите к определению . Интересно отметить сходство с другими системами объектов на Си/Си++; указатель объекта -- a id -- указывает на структуру, которая начинается с точки доступа к общей информации о классе. У меня много реализаций на Си++, это была бы таблица виртуальных функций, как это было бы с Microsoft's COM. В Cocoa подробности objc_class не раскрываются в заголовочном файле
.Тип id
обычно объявляется как:
typedef struct objc_object *id;
Это критический для Objective-C++, где тип является частью искаженного имени функции.
Вы можете посмотреть в /usr/include/objc/objc.h
.