sofas - En Cocoa, ¿cómo se define el tipo de id?
tomar leche en la noche engorda (5)
Esta pregunta es por pura curiosidad. ¿Cómo define Cocoa el tipo de identificación? ¿Es solo un typedef para un vacío *? Además, si sabe en qué archivo de encabezado está definido, me interesaría echarle un vistazo.
El tipo de id
Generalmente se declara como:
typedef struct objc_object *id;
Esto es crítico para Objective-C ++, donde el tipo es parte de un nombre de función mutilado.
Puede echar un vistazo en /usr/include/objc/objc.h
Mantenga presionada la tecla de comando y haga doble clic en cualquier término resaltado para saltar a su definición.
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
typedef struct objc_selector *SEL;
typedef id (*IMP)(id, SEL, ...);
Se encuentra en /usr/include/objc/objc.h
(en Leopard) de la siguiente manera:
typedef struct objc_object {
Class isa;
} *id;
Lo que significa que no es void *
en absoluto, sino más bien un puntero a una estructura que contiene un único miembro, apuntando a la definición de la clase. Interesante de hecho.
Recuerdo cuando estaba entrando en C y aprendí que Objective-C se implementó inicialmente como una capa de preprocesador encima de C. Ya no es así.
La mejor lectura sobre el tema que he encontrado:
en objc.h
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Para averiguarlo por su cuenta, en XCode, haga clic con el botón derecho en id , o en cualquier otro tipo, y seleccione Saltar a definición . Es interesante notar las similitudes con otros sistemas de objetos basados en C / C ++; un puntero de objeto - un id - apunta a una estructura que comienza con un punto a información de clase compartida. Tengo muchas implementaciones de C ++, esa sería la tabla de funciones virtuales, como lo sería con COM de Microsoft. En Cocoa, los detalles de objc_class no se nos revelan en el archivo de encabezado.
Puede consultar el documento aquí: http://opensource.apple.com/source/objc4/objc4-437/runtime/objc.h Espero que esto le haga un favor.