2010-01-21 20 views
5

Tengo curiosidad, ¿qué papel juega la función main int en un programa Cocoa? Prácticamente todo el código de ejemplo que he estado buscando en cuenta sólo el código siguiente en main.m:Cocoa: int función principal

#import <Cocoa/Cocoa.h> 


int main(int argc, char *argv[]) 
{ 

    return NSApplicationMain(argc, (const char **) argv); 
} 

¿Qué es exactamente este hacer, y dónde se inicia el programa realmente pasando a través de los comandos? Parece que mis concepciones necesitan reajuste.

Respuesta

10

Desde un proyecto de cacao comienza como cualquier otro, el punto de entrada para el sistema operativo es el principal. Sin embargo, Cocoa Architecture está diseñado para comenzar realmente el procesamiento de su programa desde NSApplicationMain, que se encarga de cargar la ventana inicial desde su aplicación y de iniciar el bucle de Eventos utilizado para procesar los eventos de GUI.

Apple tiene una discusión muy a fondo sobre esto bajo la Cocoa Fundamentals Guide : The Core Application Architecture on Mac OS X

+0

Ok, genial. Ese enlace es más o menos exactamente lo que estaba buscando. Una pregunta rápida si tiene tiempo: ¿cómo puedo agregar eventos a la cola de eventos que no se originan a partir de la entrada del usuario, sino desde el inicio de la aplicación? Y por supuesto, muchas gracias. Esa es una guía muy útil. –

+0

No hay problema. En realidad, es probable que desee utilizar los eventos que ya se utilizan en el inicio de la aplicación. Para la programación de Mac, el archivo Main Nib (Xib) debe tener un delegado que se ajuste a NSApplicationDelegate. Este delegado tendrá dos selectores llamados en la aplicación de inicioWillFinishLaunching: y applicationDidFinishLaunching :. utilícelos para preformar el código que debería ocurrir al inicio de la aplicación. En las plantillas para XCode, el proyecto normalmente crea una clase AppDelegate que tendrá un stub de applicationDidFinishLaunching para usted. –

+0

Me atraviesas por todas partes. Eso, nuevamente, es exactamente lo que quería saber. ¡Gracias por su amabilidad! –

4

main() es el punto de entrada para su programa.

Cuando ejecuta su programa que es la primera función llamada. Su programa finaliza cuando sale de esa función.

También tenga en cuenta que esto no viene de Objective-C. Esto es simple C.

Para consultar todas Wikipedia's page on it

+0

Gracias por responder. Lamentablemente, creo que debo haber redactado mi pregunta mal. Soy consciente de lo que es main main(), lo que me confunde es el hecho de que el código anterior es el único código en int main() en cada proyecto de muestra que he visto. Me pregunto dónde comienza a ejecutarse el código (por ejemplo, ¿por qué una subclase NSView se ejecuta y dibuja sin que yo lo llame explícitamente?) Y si no se supone que debo colocar mi bucle principal en int main() ¿a dónde va? –

+0

También podría ser útil observar qué cosas NO están dentro del punto de entrada, como por ejemplo: importaciones de librerías, definiciones de clase, prototipos de funciones, definiciones de funciones, variables globales y algunos otros objetos. Básicamente, como señaló pfandrade, el punto de entrada es donde el programa comienza y termina. – pokstad

+0

@Arthur, todavía hay un int main cuando se manejan los eventos. Hay un bucle dentro de 'int main' que constantemente escucha eventos. Por ejemplo, cuando se vuelve a dibujar la pantalla, se debe a un cambio en la pantalla que está buscando el bucle de evento. Echa un vistazo a este artículo de la wiki: http://en.wikipedia.org/wiki/Event_loop – pokstad

5

Si usted desea aprender cómo el control pasa de "lanzar este" a la función main(), la página execve hombre tiene los detalles. También querrá leer sobre dyld. main() es una parte del estándar Unix. Cada programa individual que puede ejecutar de manera efectiva tiene un main().

Como han mencionado otros, NSApplicationMain pasa el control a Cocoa. El documentation es bastante específico en cuanto a lo que hace.

Una nota interesante, NSApplicationMain en realidad no todas las devoluciones. Es decir, si separara la llamada a NSApplicationMain de la devolución en su función main y coloque un código en medio, ese código nunca se ejecutará.

+0

Hola y gracias por responder. Ese enlace de documentación ayuda a aclarar algunas de mis preguntas. Por cierto, los enlaces execve y dyld no parecen estar funcionando. ¡Gracias otra véz! –

+0

Arthur Skirvin: Funcionan bien una vez que solucionas la destrucción de Stack Overflow (odia el esquema x-man-page:).Los he reemplazado con enlaces a las versiones en línea. –

+0

Oooh ... bummer. Dejaré de hacer eso. – bbum

0

El proceso devuelve el valor devuelto por main al sistema operativo cuando finaliza el proceso.

tiendas de Shell El valor devuelto por el último proceso y se puede obtener de nuevo con $?:

> ls 
a b c 

> echo $? 
0 

> ls x 
x: No such file or directory 

> echo $? 
1 

ls es una aplicación como cualquier otra cosa.

Puede usar el valor de retorno para encadenar múltiples procesos utilizando script de shell o cualquier otra cosa que pueda ejecutar un proceso y verificar el valor de retorno.

0

me pregunto donde el código comienza ejecución (como por qué hace un NSView subclase ejecutar y dibujar sin mí una llamada explícita a ella?) Y si no tengo que meter en el bucle principal int main() ¿A dónde va?

En un proyecto de xcode, usted tiene una función principal.m archivo que contiene la función 'int main'. En realidad, no encontrará el código que llama al sorteo NSView explícitamente, este código está oculto en una estructura iPhone o Mac OS X. Simplemente sepa que hay un bucle de eventos oculto en su 'int main' que verifica los cambios para que sepa cuándo actualizar su vista. No necesita saber dónde está este ciclo de eventos, no es información útil ya que puede anular los métodos o crear y asignar delegados que pueden hacer cosas cuando esto sucede.

Para obtener una mejor respuesta, deberá explicar qué quiere decir con un "bucle principal" que quería poner dentro de la función 'int main'.

Es raro que salga de una poca experiencia en C++. Parece antinatural que la función principal sería estar tan vacía.

Puede encapsular mil millones de líneas de código en una función y ponerla en 'int main'. No te dejes engañar por un principal solo teniendo unas pocas líneas, eso se hace a propósito. Una buena programación nos enseña a mantener el código en contenedores específicos para que esté bien organizado. Apple optó por hacer el "verdadero" punto de lanzamiento de sus aplicaciones para el iPhone en esta sola línea de código dentro del archivo main.m:

int retVal = UIApplicationMain(argc, argv, nil, @"SillyAppDelegate"); 

Desde que una pieza de código, se puso en marcha el delegado de una aplicación y no Regrese el control a la función principal hasta que finalice.

+0

Muy bien, ese poco acerca de NSView me da algo de claridad. Sé que una cantidad impía de código puede ser representada por una sola línea en int main o en cualquier otro lugar; la falta de naturalidad de la función principal de Cocoa vino del hecho de que inmediatamente regresa. Viendo que siempre he indicado el final de mis aplicaciones con 'return 0' en C++, me pareció de un vistazo que esta configuración de Cocoa se cerraría inmediatamente después del lanzamiento. No entendí todo este negocio de bucle de eventos ocultos. El 'bucle principal' al que me refería es este bucle oculto. Estoy acostumbrado a construirlo yo mismo. ¡Gracias! –

Cuestiones relacionadas