2010-08-12 5 views
7

Ok, je suis tout à fait nouveau pour obj-c + cacao, il est sans doute évident, mais voilà:Relation entre AppDelegate et main.m

J'ai été le déplacement de la ligne de commande apps pour des applications de cacao en apprenant à travailler avec objectif-c dans Xcode. Une chose que je ne comprends pas vraiment est le rôle de l'AppDelegate et comment il se connecte à main.m

Il semble que vous pourriez mettre tout votre programme dans l'appdelegate et il fonctionnerait bien, et vous ne même pas besoin de main.m, mais pas l'inverse, si vous faites une application de cacao, vous devez au moins avoir l'appdelegate. J'ai fait beaucoup de développement web php et d'outils de ligne de commande, donc je suppose que ce que je cherche, c'est le fichier que le programme va exécuter en premier et qui est destiné à "contrôler" le reste d'entre eux. Est-ce que quelqu'un peut m'aider à comprendre ce qui se passe dans un programme Cocoa, comment AppDelegate et main.m sont (ou ne sont pas) liés, et quel est le flux du programme supposé être?

Répondre

8

Une fonctionnalité clé de nombreux systèmes orientés objet (tels que Cocoa) est "inversion of control", ce qui signifie que le framework exécute tout et n'importe quel code que vous écrivez est sous son contrôle. Donc, contrairement à PHP, vous n'écrivez pas le code qui s'exécute au démarrage. Par conséquent, contrairement à PHP, vous n'écrivez pas le code qui s'exécute au démarrage. Ce que vous faites est de définir des méthodes pour le délégué de l'application, les contrôleurs, les vues et d'autres objets, et laissez l'infrastructure appeler ces méthodes comme elle doit le faire. Vous ne verrez jamais le «flux de contrôle» global tout au long du programme; Vous ne verrez que le contrôle se déverse dans vos morceaux du programme. Cela peut être déroutant au début, car vous essayez de tromper le framework en appelant votre code aux moments et dans l'ordre que vous attendez, mais à long terme cela rend les choses plus faciles, comme vous pouvez le faire. faites confiance au cadre pour prendre soin de beaucoup de choses pour vous.

Dans une application Cocoa, une grande partie de la logique de l'application sera en réalité dans les contrôleurs de vue, plutôt que dans le délégué de l'application. Le délégué de l'application gère généralement les responsabilités de démarrage et d'arrêt, mais d'autres objets effectuent la plus grande partie du travail entre le démarrage et l'arrêt. Donc, n'essayez pas de tout compresser dans le délégué de l'application.

+2

+1. Toutes les informations utiles, mais ne répond pas directement à la question. Reportez-vous à la réponse de jtbandes pour la partie déléguée principale vs application. –

+1

Il ne traite pas la partie de la question à propos de main.m vs.délégué de l'application, mais je pense qu'il aborde le "ce que le flux du programme est censé être" partie, ce que je pense que le questionneur essaie vraiment de comprendre. –

+0

Cela aide beaucoup! La partie que j'ai eu du mal à saisir est ce qui doit exactement arriver dans le code pour que le framework puisse utiliser une méthode particulière quand je le veux. Quelle est la connexion exacte entre un fichier de contrôleur (controller.m et controller.h - par exemple) et l'interface utilisateur. Suis-je censé connecter l'entrée à AppDelegate et avoir les données de relais AppDelegate vers et depuis le contrôleur, ou faire directement la connexion de l'interface utilisateur au contrôleur? – Andrew

11

main.m contient la fonction main(), qui est le point d'entrée pour le programme, il est exécuté en premier. Ensuite, il appelle UIApplicationMain(), qui exécute les tâches d'installation d'applications spécifiques au système d'exploitation, et charge le fichier principal Interface Builder .xib qui contient votre instance de délégué d'application. En d'autres termes, sans votre main.m, votre délégué d'application ne serait même pas chargé.

+4

Un point important est que 'main.m' est fondamentalement un code standard qui configure tout simplement pour exécuter' UIApplicationMain() '. Il est rarement nécessaire d'ajouter ou de modifier quelque chose dans 'main()'. Ainsi, le délégué de l'application est l'endroit où "votre code" commence. –

+0

Ok, cette réponse et le commentaire ont du sens, main() commence juste le programme et la première chose à faire est de faire fonctionner l'interface utilisateur, ce qui signifie que le délégué de l'application est en cours d'exécution. – Andrew

+0

@Andrew Oui, c'est correct. Il convient également de noter que 'UIApplicationMain()' peut créer votre délégué d'application directement si vous le souhaitez, plutôt que de le charger à partir d'un fichier nib (vous passez le nom de la classe comme l'un des arguments). Si ma réponse a fonctionné pour vous, veuillez la marquer comme correcte en cliquant sur la coche sous le nombre de votes. Merci :) – jtbandes

Questions connexes