2010-08-12 27 views
7

Ok, io sono totalmente nuovo per obj-c + cacao, quindi questo è probabilmente ovvio, ma qui va:Relazione tra AppDelegate e main.m

Sono stato in movimento da linea di comando Apps per applicazioni di cacao nell'imparare a lavorare con l'obiettivo-c in Xcode. Una cosa che non capisco è il ruolo di AppDelegate e come si connette a main.m

Sembra che potresti mettere tutto il tuo programma in appdelegate e funzionerebbe bene, e non hai nemmeno ho bisogno di main.m, ma non il contrario, se stai facendo un'app di cacao devi almeno avere l'appdelegate.

Ho sviluppato molti strumenti per lo sviluppo web e la riga di comando di PHP, quindi immagino che quello che sto cercando sia il file che il programma eseguirà prima e che è destinato a "controllare" il resto di essi.

Qualcuno può aiutarmi a capire cosa sta succedendo in un programma Cocoa, come AppDelegate e main.m sono (o non sono) correlati, e quale dovrebbe essere il flusso del programma?

risposta

8

Una caratteristica chiave di molti sistemi orientati agli oggetti (come Cocoa) è "inversion of control", che in pratica significa che il framework sta eseguendo tutto e qualsiasi codice scritto è sotto il suo controllo.

Quindi, a differenza di PHP, non si scrive il codice che viene eseguito all'avvio. Quello che fai è definire i metodi per l'app delegato, i controller, le viste e altri oggetti, e lasciare che il framework invochi quei metodi come deve fare. Non vedrai mai il "flusso di controllo" globale in tutto il programma; lo vedrai solo come flusso di controllo nei tuoi pezzi del programma.

Questo può essere fonte di confusione in un primo momento, mentre si tenta di capire come ingannare il framework nel chiamare il proprio codice nei tempi e nell'ordine che ci si aspetta, ma a lungo termine rende le cose più semplici, come è possibile fidati del framework per occuparti di molte cose per te.

In un'app Cocoa, molte delle regole dell'app sono effettivamente presenti nei controller di visualizzazione, piuttosto che nel delegato dell'app. Il delegato dell'app in genere gestisce le responsabilità di avvio e arresto, ma altri oggetti eseguono la maggior parte del lavoro tra l'avvio e l'arresto. Quindi non provare a spremere tutto nel delegato dell'app.

+2

+1. Tutte le grandi informazioni, anche se non affrontano direttamente la domanda. Vedi la risposta di jtbandes per la parte delegato principale vs app. –

+1

Non indirizza la parte della domanda su main.m vs.delegato di app, ma penso che faccia riferimento alla parte "che il flusso del programma dovrebbe essere", che è ciò che penso che l'interrogante stia davvero cercando di capire. –

+0

Questo aiuta molto! La parte che ho avuto difficoltà ad afferrare è esattamente ciò che deve accadere nel codice affinché il framework sia in grado di utilizzare un particolare metodo quando lo si desidera. Qual è la connessione esatta tra un file del controller (controller.m e controller.h - ad esempio) e l'interfaccia utente. Dovrei collegare l'input all'AppDelegate e quindi avere i dati di inoltro AppDelegate da e verso il controller o effettuare direttamente la connessione dall'interfaccia utente al controller? – Andrew

11

main.m contiene la funzione main(), che è il punto di ingresso per il programma, viene eseguita per prima. Quindi chiama UIApplicationMain(), che esegue le operazioni di installazione delle applicazioni specifiche del sistema operativo e carica il file principale di Interface Builder .xib che contiene l'istanza del delegato dell'app.

Cioè, senza main.m il delegato dell'app non verrebbe nemmeno caricato.

+4

Un punto importante è che 'main.m' è fondamentalmente un codice boilerplate che semplicemente imposta tutto per eseguire' UIApplicationMain() '. Raramente c'è bisogno di aggiungere o modificare qualcosa in 'main()'. Quindi il delegato dell'app è dove inizia "il tuo codice". –

+0

Ok, questa risposta e il commento hanno senso, main() sta appena iniziando il programma e la prima cosa che fa è far andare l'interfaccia utente, il che significa che il delegato dell'app è in esecuzione. – Andrew

+0

@Andrew Sì, è corretto. Va anche notato che 'UIApplicationMain()' può creare direttamente il delegato dell'app se lo desidera, piuttosto che caricarlo da un file pennino (si passa il nome della classe come uno degli argomenti). Se la mia risposta ha funzionato per te, contrassegnala come corretta facendo clic sul segno di spunta sotto il conteggio dei voti. Grazie :) – jtbandes

Problemi correlati