Этот вопрос из чистого любопытства. Как Cocoa определяет тип идентификатора? Это просто typedef для пустоты *? Кроме того, если вы знаете, какой файл заголовка он определен, мне было бы интересно взглянуть.
В Cocoa, как определяется тип идентификатора?
Ответ 1
Удерживайте клавишу команды и дважды щелкните по любому выделенному термину, чтобы перейти к его определению.
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
typedef struct objc_selector *SEL;
typedef id (*IMP)(id, SEL, ...);
Ответ 2
Он делится в /usr/include/objc/objc.h
(на Leopard) следующим образом:
typedef struct objc_object {
Class isa;
} *id;
Это означает, что он вообще не void *
, а скорее указатель на структуру, содержащую один элемент, указывающий на определение класса. Интересно, действительно.
Я помню, когда я просто попадал на C и узнал, что Objective-C изначально был реализован как только препроцессорный слой поверх C. Это не совсем так.
Лучшее чтение по теме, которую я нашел:
Ответ 3
в objc.h
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Чтобы узнать самостоятельно, в XCode, щелкните правой кнопкой мыши id или любой другой тип - и выберите "Перейти к определению". Интересно отметить сходство с другими объектными системами на базе C/С++; указатель объекта - идентификатор - указывает на структуру, которая начинается с точки с информацией об общем классе. Я много реализаций С++, это будет таблица виртуальных функций, как это было бы с Microsoft COM. В Cocoa сведения об объекте objc_class не отображаются нам в файле заголовка.
Ответ 4
Тип id
обычно объявляется следующим образом:
typedef struct objc_object *id;
Это важно для Objective-C ++, где тип является частью имени функции с искажением.
Вы можете заглянуть в/usr/include/objc/objc.h
Ответ 5
Вы можете обратиться к документу здесь: http://opensource.apple.com/source/objc4/objc4-437/runtime/objc.h Надеюсь, это сделает вам услугу.