2012-08-07 10 views
6

Dado que Objective-C es un superconjunto C, todas las sentencias específicas de Objective-C se convierten en sentencias C durante la compilación de un archivo .m (por el preprocesador, supongo). Entonces, por ejemplo, una expresión de mensaje como [receiver method] se convierte en una llamada en la función de mensaje objc_msgSend(receiver, selector).¿Qué es una interfaz e implementación de clase Objective-C 2.0 convertida por GCC o Clang

Mi pregunta es: si tengo una definición de clase como esta:

@interface ClassA { 
    int var1; 
    float var2; 
    id var3; 
} 

-(void) method1; 
-(int) method2: (int) num1; 
@end 

@implementation ClassA 
-(void) method1 { 
    // Implementation of the method 
} 

-(int) method2: (int) num1 { 
    // Implementation of the method 
} 

@end 

¿qué es lo convierte en el compilador (en la versión 2.0 de Objective-C)? ¿Se convierte en llamadas en funciones como objc_allocateClassPair(), class_addIvar(), class_addMethod() y objc_registerClassPair(), para crear la clase, agregar sus variables de instancia, agregar sus métodos y registrar la clase, respectivamente (para que la estructura de la clase esté realmente definida en tiempo de ejecución en lugar de siendo cargado como una estructura desde el archivo ejecutable)?

Respuesta

14

Desde Objective-C es un superconjunto C, todas las declaraciones específicas de Objective-C se convierten en declaraciones C durante la compilación de un archivo .m (por el preprocesador, supongo).

Eso era cierto en 1988. Mientras Objective-C podría todavía ser compilado de esa manera, no ha sido en mucho tiempo.

El compilador analiza Objective-C, junto con C y-- a veces-- C++, y emite un árbol de sintaxis abstracta [AST] que representa el resultado postprocesado. Esa AST incluye las diversas definiciones de Objective-C de manera bastante directa.

Tenga en cuenta que los detalles de la compilación de GCC y la compilación de LLVM son divergentes.

Si mira la salida compilada, verá que el archivo mach-o, el producto ejecutable, tiene varias secciones en el archivo que contienen los metadatos de Objective-C incluidas las definiciones de clase, tablas de selector, ivar diseño, etc ... El compilador genera estos metadatos en el archivo .o y luego el enlazador lo machaca todo, elimina la información duplicada (que no es un símbolo duplicado) y escribe el mach-o.

Como alguien mencionó en una pregunta diferente, puede usar la reescritura Objective-C para reescribir Objective-C en C directa, pero el código resultante es ineficiente y bastante diferente al de compilación de regulación.

Cuestiones relacionadas