7
votes

Cocoa: fonction principale int

Je suis curieux, quel rôle la fonction principale int compte dans un programme de cacao? Pratiquement tout le code d'échantillon que j'ai envisagé n'a que le code suivant dans MAIN.M:

#import <Cocoa/Cocoa.h>


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

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


0 commentaires

5 Réponses :


4
votes

Main () est le point d'entrée de votre programme.

Lorsque vous exécutez votre programme, la première fonction est appelée. Votre programme se termine lorsque vous quittez cette fonction.

Notez également que cela ne vient pas de l'objectif-c. C'est simple c.

regarder regarder page de Wikipedia sur elle


5 commentaires

Merci de répondre. Malheureusement, je pense que je devais avoir mal à ma question mal. Je suis au courant de ce que Int Main () est, ce que je suis confus, c'est le fait que le code ci-dessus est le seul code dans Int Main () dans chaque exemple de projet que j'ai examiné. Je me demande où commence le code exécutant (comme pourquoi une sous-classe Nsview exécute-t-elle et dessine-t-elle sans que je l'appelais explicitement?) Et si je ne suis pas censé coller ma boucle principale dans Int Main () Où va-t-il?


Il peut également être utile de noter que les choses ne sont pas à l'intérieur du point d'entrée, telles que: les importations de bibliothèques, les définitions de classe, les prototypes de fonction, les définitions de fonction, les variables globales et d'autres friandises. Fondamentalement, comme l'a souligné Pfandrade, le point d'entrée est l'endroit où vous programme commence et se termine.


@Arthur, il y a toujours un INT principal lorsque les événements sont traités. Il y a une boucle à l'intérieur du «Int Main» qui écoute constamment des événements. Par exemple, lorsque l'écran est redessiné, il est dû à une modification de l'écran que la boucle d'événement recherche. Découvrez cet article Wiki: en.wikipedia.org/wiki/event_loop


C'est juste étrange pour moi sortir d'une petite expérience en C ++. Il semble non naturel que la fonction principale serait si vide.


@Arthur Voyez ma réponse ci-dessous, j'ai abordé votre préoccupation concernant le NSVIEW.



12
votes

Étant donné qu'un projet de cacao commence comme tout autre, le point d'entrée du système d'exploitation est principal. Cependant, l'architecture de cacao est construite pour lancer le traitement de votre programme à partir de NsapplicationMain, responsable de la chargement de la fenêtre initiale de votre application et de démarrer la boucle d'événements utilisés pour traiter les événements de l'interface graphique.

Apple a une discussion très approfondie sur cette question sous le Guide des fondamentaux de cacao: l'architecture de l'application principale sur Mac OS X


3 commentaires

OK cool. Ce lien est à peu près exactement ce que je cherchais. Une question rapide si vous avez le temps: comment puis-je obtenir des événements ajoutés à la file d'attente d'événement qui ne provient pas de la saisie de l'utilisateur, mais à partir du démarrage de l'application? Et bien sûr, merci beaucoup. C'est un guide très très utile.


Aucun problème. En fait, vous voudrez probablement utiliser les événements déjà utilisés au démarrage de l'application. Pour la programmation Mac, le fichier MAIN NIB (XIB) devrait avoir un délégué qui est conforme à NsapplicationDelegate. Ce délégué aura deux sélecteurs appelés à l'application de démarrageWillFinishLaunching: et ApplicationDidDfinishLaunching :. Utilisez celles-ci pour préformer le code qui devrait arriver au démarrage de l'application. Dans les modèles de Xcode, le projet crée normalement une classe d'appdelegate qui aura un talon d'applicationDiderfinishlanching pour vous.


Tu viens pour moi partout. C'est vraiment ce que je voulais savoir. Merci de bien vouloir!



5
votes

Si vous voulez apprendre comment le contrôle passe de "lancer ceci" à la fonction Main () , le Execve La page Man a les détails. Vous voudrez également lire sur DYLD . principal () fait partie de la norme UNIX. Chaque programme que vous pouvez exécuter efficacement a un principal () .

Comme d'autres personnes ont mentionné, nsappllicationMain passe le contrôle de cacao. Le La documentation est assez spécifique à ce qu'elle fait.

Une note intéressante, nsappllicationMain n'est pas réellement de retour. C'est-à-dire que si vous deviez séparer l'appel à nsaplylicationmain à partir du retour dans votre fonction Main et mettez le code entre, ce code ne serait jamais exécuté.


3 commentaires

Hé là-bas et merci d'avoir répondu. Ce lien de documentation contribue à préciser certaines de mes questions. Au fait, le métier et les liens DYLD ne semblent pas fonctionner. Merci encore!


Arthur Skirvin: Ils fonctionnent bien une fois que vous réalisez la mangling de la pile de pile (il déteste la page X-Man: schéma). Je les ai remplacés avec des liens vers les versions en ligne.


Oooh ... bummer. Je vais arrêter de faire ça.



0
votes

La valeur renvoyée de MAIN est renvoyée par le processus au système d'exploitation lorsque le processus est effectué.

shell stocke la valeur renvoyée par dernier processus et vous pouvez le récupérer avec $? : < / p> xxx

ls est une application comme une autre chose.

Vous pouvez utiliser la valeur de retour pour chaîner plusieurs processus ensemble à l'aide de script shell ou autre chose qui peut exécuter un processus et vérifiez la valeur de retour.


0 commentaires

0
votes

Je me demande où commence le code exécutant (comme pourquoi une nsview Sous-classe exécuter et dessiner sans moi l'appelant explicitement?) Et si je ne suis pas censé coller ma boucle principale dans int Main () Où va-t-il?

Dans un projet Xcode, vous avez un fichier principal.M contenant la fonction 'int Main'. Vous ne trouverez pas le code qui appelle le nsview Draw explicitement, ce code est caché au-delà d'un cadre iPhone ou Mac OS X. Sachez simplement qu'il existe une boucle d'événement cachée au-dessus de votre «Int Main» qui vérifie les changements afin qu'il sache quand mettre à jour votre vue. Vous n'avez pas besoin de savoir où se trouve cette boucle d'événement, ce n'est pas des informations utiles car vous pouvez remplacer des méthodes ou créer des délégués pouvant faire des choses lorsque cela se produit.

Pour obtenir une meilleure réponse, vous " Il faut expliquer ce que vous entendez par une «boucle principale» que vous vouliez mettre à l'intérieur de la fonction «Int Main».

C'est juste bizarre pour moi sortir d'un Peu d'expérience en C ++. Il a l'air non naturel que la fonction principale serait être si vide.

Vous pouvez encapsuler un milliard de lignes de code dans une seule fonction et la mettre dans "INT MAIN". Ne soyez pas trompé par une principale n'ayant que quelques lignes, cela est fait exprès. Une bonne programmation nous apprend à garder le code dans des conteneurs spécifiques afin qu'il soit bien organisé. Apple a choisi de faire le point de lancement "réel" de leurs applications iPhone dans cette seule ligne de code à l'intérieur du fichier MAIN.M: xxx

à partir de celui-ci, un Le délégué de l'application est lancé et ne reviendra pas le contrôle de la fonction principale jusqu'à ce qu'il soit fait.


1 commentaires

Très bien, ce peu sur Nsview me donne une certaine clarté. Je sais qu'une quantité irrégulière de code peut être représentée par une seule ligne dans l'intégrateur principal ou ailleurs; La seule éventualité de la fonction principale du cacao est venue du fait qu'il revient immédiatement. Voyant comme j'ai toujours indiqué la fin de mes applications par 'Retour 0' en C ++, il m'a semblé en un coup d'œil que cette configuration de cacao quitterait immédiatement après le lancement. Je n'ai pas compris cette entreprise de boucle d'événement cachée. La "boucle principale" que je faisais référence à cette boucle cachée. Je suis juste habitué à la construire moi-même. Merci!