2012-07-18 15 views
5

Quiero saber quién llamará al método principal en objetivo-c?¿Quién llamará al método principal en el objetivo c

Sé que el (nulo, nulo, nulo, NSStringFromClass [Appdelgate clase]) Método método se llama desde el método main() y entonces el proceso continúa desde didFinishLaunchingWithOptions AppDelegate() UIApplicationMain .....

Y i También sé que JVM llama al método main() en java y el proceso está pasando del método main().

Así, quiero saber quién llamará main() en objective-c.

gracias por la ayuda

Respuesta

3

La manera más fácil de averiguar es pegarse un punto de interrupción en main() y echar un vistazo:

call stack

Así que, técnicamente, la respuesta a la pregunta es que se llama main() de algo llamado start. No obtiene el código fuente start, pero puede mirar el código de ensamblado en el depurador si lo desea. Esta versión es de código incorporado para el simulador:

0x1c30: pushl $0 
0x1c32: movl %esp, %ebp 
0x1c34: andl $-16, %esp 
0x1c37: subl $16, %esp 
0x1c3a: movl 4(%ebp), %ebx 
0x1c3d: movl %ebx, (%esp) 
0x1c40: leal 8(%ebp), %ecx 
0x1c43: movl %ecx, 4(%esp) 
0x1c47: addl $1, %ebx 
0x1c4a: shll $2, %ebx 
0x1c4d: addl %ecx, %ebx 
0x1c4f: movl %ebx, 8(%esp) 
0x1c53: movl (%ebx), %eax 
0x1c55: addl $4, %ebx 
0x1c58: testl %eax, %eax 
0x1c5a: jne 0x00001c53    ; start + 35 
0x1c5c: movl %ebx, 12(%esp) 
0x1c60: calll 0x00001c70    ; main at main.m:9 
0x1c65: movl %eax, (%esp) 
0x1c68: calll 0x00002376    ; exit 
0x1c6d: hlt  
0x1c6e: nop  
0x1c6f: nop 

Si crea un programa de línea de comandos MacOS X y poner un punto de interrupción en main(), usted encontrará que es llamado por main()start en el escritorio, también. El ensamblaje para la versión Mac de start no es exactamente igual, pero está muy cerca. Entonces, es una buena suposición que el compilador genere start en base a la plataforma de destino, y que start es el punto de entrada que busca el sistema operativo cuando está lanzando un programa.

+0

Muchas gracias –

1

Desde Objetivo- C es una derivada de C, la mayoría de los internos son similares (por lo que puedes mezclar el código C \ C++ con Objective-C)). Como tal, cuando ambos se compilan en ejecutables, funcionan con sistemas similares. Esta es también la razón por la cual Objective-C es compilada por gcc o Clang.

Teniendo esto en cuenta, ¿qué ocurre cuando compilas? Todo su código C se convierte en código Assembly \ machine (ya que Assembly es solo una versión mnemónica del código de máquina). El montaje está en un nivel más bajo que Java; la CPU simplemente lo ejecuta y ejecuta cada instrucción individual secuencialmente. La función main() en C lenguajes es donde el compilador 'sabe' dónde comienzan las instrucciones. Después de hacer todas sus declaraciones, la función main() se salta a con una instrucción llamada 'jmp'.

Entonces, ¿qué ocurre cuando compilas en Xcode e inicias? Primero, gcc/Clang convierte el código en Assembly \ machine code. En segundo lugar, Xcode carga el archivo binario en la memoria. En tercer lugar, Darwin (OS X o iOS, o cualquier sistema operativo para el caso) reconoce que este es un área ejecutable de la memoria, y comienza desde la parte superior del conjunto de instrucciones y se ejecuta a través de cada instrucción.

Para responder a su pregunta, la función main() la inicia la CPU. Esto es diferente a Java, que tiene un conjunto de instrucciones independiente de la plataforma que se 'emula' en la JVM.

This pregunta tiene una gran respuesta que explica cómo se traduce la función main() al código de ensamblaje.

2

En la mayoría de los sistemas, el sistema operativo tiene funciones especiales encargadas de cargar programas ejecutables en la memoria. Asignan la memoria requerida y cargan la información del archivo en ese espacio. En algunos casos, incluso pueden hacer modificaciones especiales al código para que funcione en el espacio de memoria específico donde se está cargando.

Después de cargar el programa en la memoria, el sistema operativo pasa el control al principio del segmento de código del archivo de programa. El comienzo del segmento de código generalmente tiene una pequeña rutina que realiza algunas operaciones necesarias, como inicializar la pila y el montón de memoria. Cuando esas cosas se hacen, pasa el control a la función main().

Cuestiones relacionadas