В Cocoa, как определяется тип идентификатора?

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

Ответ 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. Это не совсем так.

Лучшее чтение по теме, которую я нашел:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

Ответ 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