2009-11-02 1 views
32

Sto cercando un buon modo per dire alla mia applicazione Cocoa di uscire da sola. Siate certi che questo non verrà utilizzato per il codice di produzione. Sto solo cercando un modo semplice per eseguire un test e quindi chiudere l'applicazione durante il debug.Come posso dire alla mia applicazione Cocoa di uscire dall'applicazione stessa?

Ho trovato che exit(0); chiuderà l'applicazione, ma ignora tutte le normali procedure di uscita dell'applicazione e vorrei mantenerle tutte in posizione.

In sostanza, voglio che le cose funzionino come se un utente tirasse "Esci" dal menu, ma voglio che accada automaticamente dopo aver completato il mio test.

Il mio codice attualmente appare così:

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

... e, naturalmente, "DoSomething" dovrebbe essere "doSomething" .... – bbum

+1

Grazie, bbum. L'ho cambiato –

risposta

82

si può praticamente certi che la vostra applicazione sta per essere ucciso almeno un po 'del tempo. Quindi, la difesa contro le uscite come exit(0);è richiesta.

Tuttavia, la NSApplication implementa il metodo -terminate:.

[NSApp terminate: nil]; dovrebbe fare quello che vuoi.

In generale, suggerisco di postarlo tramite -performSelector:afterDelay: con un ritardo di 0.0 per forzarlo a verificarsi nella parte superiore del passaggio successivo attraverso il ciclo degli eventi.

Esempio:

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

Che funziona perfettamente. Grazie! –

+31

Per quelli di voi che sono densi (come me) e non è possibile ottenere la sintassi esattamente corretta (continuavo a dimenticare i due punti dopo la terminazione) la riga intera avrebbe letto: [NSApp performSelector: @selector (termina :) withObject: nil afterDelay : 0.0]; – BarrettJ

+1

In questi giorni dispatch_async sarebbe probabilmente un modo migliore per farlo. –

2

Sembra [NSApp terminare: id] è stato deprecato. Così, come @bbum Stati, utilizzare questo:

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

Funziona come mi aspetto quando si aggiunge una voce di menu Esci per un menu barra di stato di un app LSUIElement.

+10

'[NSApp terminate:]' non è deprecato. La deprecazione che vedi nel completamento automatico viene dal metodo 'terminate' di' NSInputServiceProvider'. E se fosse deprecato non dovresti chiamarlo in 'performSelector :::'. –

+0

Ha! Buona cattura, grazie. – Matt