2009-11-02 15 views
32

Je cherche un bon moyen de dire à mon application Cocoa de se quitter. Soyez assuré que cela ne sera pas utilisé pour le code de production. Je suis juste à la recherche d'un moyen facile d'exécuter un test, puis fermez l'application pendant le débogage.Comment puis-je demander à mon application Cocoa de quitter l'application elle-même?

J'ai trouvé que exit(0); va fermer l'application, mais il contourne toutes les procédures normales de sortie de l'application, et je voudrais les garder tous en place. Essentiellement, je veux que les choses fonctionnent comme si un utilisateur tirait "Quitter" du menu, mais je veux que cela se fasse automatiquement après avoir fini mon test.

Mon code ressemble actuellement à ceci:

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

... et, bien sûr, 'DoSomething' devrait être' doSomething' .... – bbum

+1

Merci, bbum. Je l'ai changé. –

Répondre

82

Vous pouvez très bien être assuré que votre application va se faire tuer au moins une partie du temps. Ainsi, la défense contre les sorties exit(0);est requise. Toutefois, NSApplication implémente la méthode -terminate:.

[NSApp terminate: nil]; devrait faire ce que vous voulez.

Je suggère généralement de l'afficher via -performSelector:afterDelay: avec un délai de 0.0 pour le forcer à se produire au sommet de la passe suivante à travers la boucle d'événements.

Exemple:

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

Cela fonctionne parfaitement. Je vous remercie! –

+31

Pour ceux d'entre vous qui sont denses (comme moi) et ne pouvaient pas obtenir la syntaxe exacte (j'ai gardé oublier les deux points après la fin) la ligne complète serait: [NSApp performSelector: @selector (terminate :) withObject: nil afterDelay : 0,0]; – BarrettJ

+1

Ces jours-ci, dispatch_async serait probablement une meilleure façon de faire. –

2

Il ressemble à [NSApp fin: id] a été dépréciée. Donc, comme @bbum états, utilisez ceci:

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

Il fonctionne comme je l'attends lors de l'ajout d'un élément de menu Quitter un menu barre d'état d'une application LSUIElement.

+10

'[NSApp terminate:]' n'est pas obsolète. La dépréciation que vous voyez dans auto complete vient de la méthode 'terminate' de' NSInputServiceProvider'. Et si cela devait être déprécié, vous ne devriez pas l'appeler dans 'performSelector :::'. –

+0

Ha! Bonne prise, merci. – Matt