2010-01-02 11 views
8

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.En Cocoa, ¿cómo se define el tipo de id?

Respuesta

23

Mantenga presionada la tecla de comando y haga doble clic en cualquier término resaltado para ir 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, ...); 
+1

+1 cmd + doble click es maravillosamente útil! –

+0

+1 Gran respuesta. Espero trabajar más con XCode en el próximo año, y el atajo de teclado será muy útil para saberlo. –

+0

+1 sobre mi propia respuesta. Ya lo sabía, pero es demasiado útil. – Mike

6

en objc.h

typedef struct objc_class *Class; 
typedef struct objc_object { 
    Class isa; 
} *id; 

Para averiguar por su cuenta, en XCode, haga clic derecho Identificación - o cualquier otro tipo - y seleccione Cambiar 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.

2

El tipo id se declara generalmente como:

typedef struct objc_object *id; 

Este es crítico para Objective-C++ donde el tipo es parte de un nombre de función despedazado.

Puede echar un vistazo en /usr/include/objc/objc.h

7

Se declararse no en /usr/include/objc/objc.h (en Leopard) de la siguiente manera:

typedef struct objc_object { 
    Class isa; 
} *id; 

que significa que no es en void * todo, 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:

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

Cuestiones relacionadas