2010-01-21 17 views
5

Ich bin gespannt, welche Rolle spielt die Int-Hauptfunktion in einem Cocoa-Programm? Praktisch alle Beispielcode Ich habe bei der Suche nur den folgenden Code in main.m:Cocoa: int Hauptfunktion

#import <Cocoa/Cocoa.h> 


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

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

Was genau dies zu tun ist, und wo das Programm startet tatsächlich durch Befehle treten? Es scheint, dass meine Vorstellungen nachjustiert werden müssen.

Antwort

10

Da ein Cocoa-Projekt wie jedes andere beginnt, ist der Einstiegspunkt für die Betriebssystem-Haupt. Die Cocoa-Architektur ist jedoch so konstruiert, dass sie tatsächlich die Verarbeitung Ihres Programms von NSApplicationMain aus startet, das dafür zuständig ist, das Anfangsfenster aus Ihrer Anwendung zu laden und die Ereignisschleife zur Verarbeitung von GUI-Ereignissen zu starten.

von Apple hat eine sehr eingehende Diskussion über das unter dem Cocoa Fundamentals Guide : The Core Application Architecture on Mac OS X

+0

Ok, cool. Diese Verbindung ist genau das, wonach ich gesucht habe. Eine kurze Frage, wenn Sie Zeit haben: Wie kann ich Ereignisse zur Ereigniswarteschlange hinzufügen, die nicht von Benutzereingaben stammen, sondern vom Start der Anwendung? Und natürlich vielen Dank. Das ist ein sehr sehr hilfreicher Leitfaden. –

+0

Kein Problem. Tatsächlich werden Sie wahrscheinlich die Ereignisse verwenden wollen, die bereits beim Start der Anwendung verwendet werden. Für die Mac-Programmierung sollte die Datei Main Nib (Xib) über einen Delegaten verfügen, der NSApplicationDelegate entspricht. Dieser Delegat hat zwei Selektoren, die beim Start von applicationWillFinishLaunching aufgerufen werden: und applicationDidFinishLaunching :. Verwenden Sie diese, um Code vorzufixieren, der beim Start der App passieren soll. In den Vorlagen für XCode erstellt das Projekt normalerweise eine AppDelegate-Klasse, die für Sie einen Stub von applicationDidFinishLaunch enthält. –

+0

Sie kommen überall für mich durch. Das ist genau das, was ich wissen wollte. Dankesehr! –

4

main() ist der Einstiegspunkt für Ihr Programm.

Wenn Sie Ihr Programm ausführen, ist die erste Funktion aufgerufen. Ihr Programm endet, wenn Sie diese Funktion verlassen.

Beachten Sie auch, dass dies nicht von Objective-C stammt. Das ist einfach C.

Werfen Sie einen Blick auf Wikipedia's page on it

+0

Danke für die Beantwortung. Leider muss ich meine Frage schlecht formuliert haben. Ich bin mir dessen bewusst, was int main() ist, worüber ich verwirrt bin, ist die Tatsache, dass der obige Code der einzige Code in int main() in jedem Beispielprojekt ist, das ich mir angeschaut habe. Ich frage mich, wo der Code beginnt zu starten (wie warum eine NSView-Unterklasse ausgeführt und gezeichnet wird, ohne dass ich sie explizit anrufe?) Und wenn ich meine Hauptschleife nicht in int main() stecken soll, wo geht es hin? –

+0

Es kann auch hilfreich sein, zu notieren, welche Dinge sich nicht innerhalb des Einstiegspunktes befinden, wie zum Beispiel: Bibliotheksimporte, Klassendefinitionen, Funktionsprototypen, Funktionsdefinitionen, globale Variablen und einige andere Goodies. Grundsätzlich, wie Pfandrade aufzeigt, ist der Einstiegspunkt der Anfang und das Ende des Programms. – pokstad

+0

@Arthur, es gibt immer noch eine int main, wenn Ereignisse behandelt werden. Es gibt eine Schleife innerhalb des 'int main', die ständig nach Ereignissen lauscht. Wenn der Bildschirm beispielsweise neu gezeichnet wird, liegt das an einer Änderung des Bildschirms, nach der die Ereignisschleife sucht. Schau dir diesen Wiki-Artikel an: http://en.wikipedia.org/wiki/Event_loop – pokstad

5

Wenn Sie erfahren möchten, wie geht die Steuerung von „starten dieses“ die main() Funktion, die execve Manpage die Details hat. Sie möchten auch über dyld lesen. main() ist ein Teil des Unix-Standards. Jedes einzelne Programm, das Sie effektiv ausführen können, hat eine main().

Wie andere bereits erwähnt haben, übergibt NSApplicationMain die Kontrolle an Cocoa. Die documentation ist ziemlich genau, was es tut.

Eine interessante Anmerkung, NSApplicationMain nicht wirklich jede Rückkehr. Das heißt, wenn Sie den Aufruf an NSApplicationMain von der Rückkehr in Ihrer main-Funktion trennen und Code zwischen eingeben würden, würde dieser Code nie ausgeführt werden.

+0

Hey, und danke für die Antwort. Dieser Dokumentationslink hilft bei der Klärung einiger meiner Fragen. Die execve und dyld Links scheinen übrigens nicht zu funktionieren. Noch einmal Danke! –

+0

Arthur Skirvin: Sie funktionieren gut, sobald Sie Stack Overflow Mangling beheben (es hasst das x-man-page: Schema).Ich habe sie durch Links zu den Online-Versionen ersetzt. –

+0

Oooh ... schade. Ich werde damit aufhören. – bbum

0

Der von main zurückgegebene Wert wird vom Prozess an das Betriebssystem zurückgegeben, wenn der Prozess abgeschlossen ist.

Shell speichert den Wert von im letzten Prozess zurückgeführt und Sie können es wieder mit $? erhalten:

> ls 
a b c 

> echo $? 
0 

> ls x 
x: No such file or directory 

> echo $? 
1 

ls ist eine Anwendung, wie alles andere.

Sie können den Rückgabewert verwenden, um mehrere Prozesse miteinander zu verketten, indem Sie ein Shell-Skript oder etwas anderes verwenden, das einen Prozess ausführen und den Rückgabewert prüfen kann.

0

Ich frage mich, wo der Code beginnt Ausführung (wie, warum tut eine NSView Unterklasse ausführen und zeichnen, ohne ich ausdrücklich nenne es ?) Und wenn ich nicht soll meine Hauptschleife in int-Stick main() wohin geht es?

In einem xcode-Projekt haben Sie eine Hauptversion.m-Datei, die die Funktion 'int main' enthält. Sie werden den Code, der die NSView-Zeichnung explizit aufruft, nicht wirklich finden. Dieser Code ist tief in einem iPhone- oder Mac OS X-Framework versteckt. Sie müssen wissen, dass eine Ereignisschleife tief in Ihrem 'int main' versteckt ist, die nach Änderungen sucht, um zu wissen, wann Sie Ihre Ansicht aktualisieren müssen. Sie müssen nicht wissen, wo diese Ereignisschleife ist, es ist keine nützliche Information, da Sie Methoden überschreiben oder Delegaten erstellen und zuweisen können, die in diesem Fall Dinge tun können.

Um eine bessere Antwort zu erhalten, müssen Sie erklären, was Sie mit einer 'Hauptschleife' meinen, die Sie in die Funktion 'int main' einfügen wollten.

Es ist einfach komisch für mich, eine kleine Erfahrung in C++ zu bekommen. Es sieht unnatürlich aus, dass die Hauptfunktion so leer wäre.

Sie können eine Milliarde Codezeilen in eine Funktion kapseln und in 'int main' einfügen. Lassen Sie sich nicht von einer Hauptleitung täuschen, die nur ein paar Zeilen hat, das ist absichtlich getan. Eine gute Programmierung lehrt uns, den Code in speziellen Containern zu halten, damit er gut organisiert ist. Apple entschied sich für die „echte“ Startpunkt ihrer iPhone-Apps in dieser Zeile Code in der Datei main.m zu machen:

int retVal = UIApplicationMain(argc, argv, nil, @"SillyAppDelegate"); 

Von diesem ein Stück Code, einem Delegierten App gestartet wird und wird nicht steuere die Hauptfunktion zurück, bis sie fertig ist.

+0

Alrighty, das bisschen über NSView gibt mir etwas Klarheit. Ich weiß, dass eine ungeheure Menge Code durch eine einzige Zeile in int main oder anderswo dargestellt werden kann; Die Unnatürlichkeit der Hauptfunktion von Cocoa kam von der Tatsache, dass es sofort zurückkehrt. Da ich in C++ immer das Ende meiner Apps mit "return 0" angegeben habe, erschien mir auf einen Blick, dass dieses Cocoa-Setup sofort nach dem Start beendet würde. Ich habe das ganze verborgene Event-Loop-Geschäft nicht verstanden. Die "Hauptschleife", auf die ich mich bezog, ist diese versteckte Schleife. Ich bin es einfach gewohnt, es selbst zu konstruieren. Vielen Dank! –