2009-11-02 14 views
32

Estoy buscando una buena manera de decirle a mi aplicación Cocoa que se vaya. Tenga la seguridad de que esto no se usará para el código de producción. Solo busco una forma fácil de ejecutar una prueba y luego cerrar la aplicación durante la depuración.¿Cómo puedo decirle a mi aplicación Cocoa que cierre desde la propia aplicación?

He encontrado que exit(0); cerrará la aplicación, pero omite todos los procedimientos de salida de la aplicación normal, y me gustaría mantener todos en su lugar.

Esencialmente quiero que las cosas funcionen como si un usuario sacara "Salir" del menú, pero quiero que suceda automáticamente después de que haya terminado con mi prueba.

Mi código actualmente se ve así:

#if (SUPERFANCY_TESTING_MODE) 
    [self doSomething]; 
    exit(0); // <-- I need something better to go here 
#endif 
+3

... y, por supuesto, 'DoSomething' debe ser' doSomething' .... – bbum

+1

Gracias, bbum. Lo he cambiado –

Respuesta

82

se puede casi seguro de que su aplicación va a matar al menos una parte del tiempo. Por lo tanto, la defensa contra salidas como exit(0);es requerido.

Sin embargo, NSApplication implementa el método -terminate:.

[NSApp terminate: nil]; debe hacer lo que quiera.

Por lo general, sugiero publicarlo a través de -performSelector:afterDelay: con un retraso de 0.0 para forzarlo a pasar a la parte superior de la siguiente pasada a través del ciclo de eventos.

Ejemplo:

[NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.0]; 
+0

Eso funciona perfectamente. ¡Gracias! –

+31

Para aquellos de ustedes que son densos (como yo) y no pudieron obtener la sintaxis exactamente correcta (seguía olvidando los dos puntos después de terminar) la línea completa decía: [NSApp performSelector: @selector (termina :) conObjeto: nil afterDelay : 0.0]; – BarrettJ

+1

En estos días, dispatch_async sería probablemente una mejor manera de hacerlo. –

2

Parece que [NSApp terminar: id] está desfasada. Así que, como @bbum estados, utilice esto:

[NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.0]; 

Funciona como espero que cuando se añade un elemento de menú Salir para un menú de la barra de estado de una aplicación LSUIElement.

+10

'[NSApp terminate:]' no está en desuso. La degradación que ve en autocompletar proviene del método 'terminate' de' NSInputServiceProvider'. Y si está en desuso, no debes llamarlo en 'performSelector :::'. –

+0

¡Ja! Buena captura, gracias. – Matt

Cuestiones relacionadas