2010-08-12 10 views
7

Ok, estoy totalmente nuevo para obj-c + cacao, así que esto es probablemente obvio, pero aquí va:Relación entre AppDelegate y main.m

he estado moviendo desde la línea de comandos Apps para aplicaciones de cacao en aprender a trabajar con Object-C en Xcode. Una cosa que realmente no entiendo es el papel de AppDelegate y cómo se conecta a main.m

Parece que podría poner todo su programa en el appdelegate y funcionaría bien, y usted ni siquiera necesita main.m, pero no al revés, si está haciendo una aplicación de cacao, al menos debe tener el appdelegate.

He hecho muchas herramientas de desarrollo web y línea de comandos php, así que supongo que lo que estoy buscando es el archivo que el programa ejecutará primero y tiene la intención de "controlar" el resto de ellos.

¿Alguien puede ayudarme a entender qué está pasando en un programa Cocoa, cómo se relacionan (o no) AppDelegate y main.m, y cuál es el flujo del programa?

Respuesta

8

Una característica clave de muchos sistemas orientados a objetos (como Cocoa) es "inversion of control", lo que básicamente significa que el marco ejecuta todo, y cualquier código que escriba está bajo su control.

Por lo tanto, a diferencia de PHP, no se escribe el código que se ejecuta al inicio. Lo que debe hacer es definir métodos para el delegado de la aplicación, los controladores, las vistas y otros objetos, y dejar que el marco invoque esos métodos según lo necesite. Nunca verá el "flujo de control" general a lo largo del programa; solo lo verás a medida que el control fluya en tus piezas del programa.

Esto puede ser confuso al principio, ya que trata de descubrir cómo engañar al marco para que llame a su código en el momento y en el orden que espera, pero a la larga realmente hace las cosas más fáciles, como puede confíe en el marco para encargarse de muchas cosas para usted.

En una aplicación Cocoa, gran parte de la lógica de la aplicación estará en los controladores de vista, en lugar de en el delegado de la aplicación. El delegado de aplicaciones generalmente maneja las responsabilidades de inicio y cierre, pero otros objetos hacen la mayor parte del trabajo entre el inicio y el apagado. Así que no intentes meter todo en el delegado de la aplicación.

+2

+1. Toda la información excelente, aunque no aborda directamente la pregunta. Vea la respuesta de jtbandes para la parte delegada de la principal contra la aplicación. –

+1

No aborda la parte de la pregunta sobre main.m vs.delegado de la aplicación, pero creo que aborda la parte "lo que se supone que es el flujo del programa", que es lo que creo que el que pregunta realmente está tratando de descifrar. –

+0

¡Esto ayuda mucho! La parte que he estado teniendo dificultades para captar es exactamente lo que debe suceder en el código para que el marco pueda usar un método en particular cuando yo quiera. ¿Cuál es la conexión exacta entre un archivo de controlador (controller.m y controller.h - por ejemplo) y la interfaz de usuario. ¿Se supone que debo enganchar la entrada a AppDelegate y luego tener los datos de retransmisión de AppDelegate hacia y desde el controlador, o hacer la conexión desde la interfaz de usuario al controlador directamente? – Andrew

11

main.m contiene la función main(), que es el punto de entrada para el programa, se ejecuta primero. Luego llama al UIApplicationMain(), que hace las cosas de configuración de aplicaciones específicas del sistema operativo, y carga el archivo principal Interface Builder .xib que contiene la instancia delegada de su aplicación.

Es decir, sin main.m su delegado de la aplicación ni siquiera se cargará.

+4

Un punto importante es que 'main.m' es básicamente un código repetitivo que simplemente configura todo para ejecutar' UIApplicationMain() '. Rara vez es necesario agregar o cambiar algo en 'main()'. Entonces, el delegado de aplicaciones es donde comienza "tu código". –

+0

Ok, esta respuesta y el comentario tienen sentido, main() solo está iniciando el programa y lo primero que hace es poner en marcha la UI, lo que significa que el delegado de la aplicación se está ejecutando. – Andrew

+0

@Andrew Sí, eso es correcto. También se debe tener en cuenta que 'UIApplicationMain()' puede crear su delegado de aplicación directamente si lo desea, en lugar de cargarlo desde un archivo nib (usted pasa el nombre de clase como uno de los argumentos). Si mi respuesta funcionó para usted, márquela como correcta haciendo clic en la marca de verificación debajo del recuento de votos. Gracias :) – jtbandes

Cuestiones relacionadas