2012-07-18 6 views
5
anrufen

Ich möchte wissen, wer Hauptmethode in objective-c aufrufen wird?Wer wird Hauptmethode in Ziel c

weiß, dass ich die UIApplicationMain (null, null, null, NSStringFromClass [Appdelgate Klasse]) Methode wird von main() Methode aufrufen und dann weiter Prozess von AppDelegate didFinishLaunchingWithOptions() -Methode .....

Und i weiß auch, dass die Methode main() in Java von JVM aufgerufen wird und der Prozess von der Methode main() ausgeht.

So möchte ich wissen, wer main() in objective-c aufrufen wird.

Dank für Hilfe

Antwort

3

Der einfache Weg ist, um herauszufinden, einen Haltepunkt in main() zu bleiben und einen Blick:

call stack

die Antwort auf die Frage Technisch gesehen, ist, dass main() von etwas start genannt genannt wird. Sie erhalten den Quellcode für start nicht, aber Sie können den Assemblycode im Debugger anzeigen, wenn Sie möchten. Diese Version ist von Code für den Simulator gebaut:

0x1c30: pushl $0 
0x1c32: movl %esp, %ebp 
0x1c34: andl $-16, %esp 
0x1c37: subl $16, %esp 
0x1c3a: movl 4(%ebp), %ebx 
0x1c3d: movl %ebx, (%esp) 
0x1c40: leal 8(%ebp), %ecx 
0x1c43: movl %ecx, 4(%esp) 
0x1c47: addl $1, %ebx 
0x1c4a: shll $2, %ebx 
0x1c4d: addl %ecx, %ebx 
0x1c4f: movl %ebx, 8(%esp) 
0x1c53: movl (%ebx), %eax 
0x1c55: addl $4, %ebx 
0x1c58: testl %eax, %eax 
0x1c5a: jne 0x00001c53    ; start + 35 
0x1c5c: movl %ebx, 12(%esp) 
0x1c60: calll 0x00001c70    ; main at main.m:9 
0x1c65: movl %eax, (%esp) 
0x1c68: calll 0x00002376    ; exit 
0x1c6d: hlt  
0x1c6e: nop  
0x1c6f: nop 

Wenn Sie ein MacOS X Kommandozeilen-Programm und setzen Sie einen Haltepunkt in main() erstellen, werden Sie feststellen, dass main() von start auf dem Desktop aufgerufen wird, auch. Die Assembly für die Mac-Version von start ist nicht genau das gleiche, aber es ist sehr nah. Es ist also eine gute Schätzung, dass start für Sie von dem Compiler basierend auf der Zielplattform generiert wird und dass start der Einstiegspunkt ist, nach dem das Betriebssystem sucht, wenn es ein Programm startet.

+0

Vielen Dank –

1

Seit objektiv- C ist ein Derivat von C, viele der Interna sind ähnlich (weshalb Sie C/C++ - Code mit Objective-C kombinieren können)). Wenn beide zu ausführbaren Dateien kompiliert werden, arbeiten sie von ähnlichen Systemen ab. Dies ist auch der Grund, warum Objective-C von gcc oder Clang kompiliert wird.

In diesem Sinne was passiert, wenn Sie kompilieren? Ihr gesamter C-Code wird in Assembly \ machine code konvertiert (da Assembly nur eine mnemonische Version des Maschinencodes ist). Assembly ist auf einer niedrigeren Ebene als Java; Die CPU durchläuft sie einfach und führt jeden einzelnen Befehl sequentiell aus. Die main()-Funktion in C-Sprachen ist, wo der Compiler weiß, wo die Anweisungen beginnen. Nachdem Sie alle Ihre Deklarationen durchgeführt haben, wird die Funktion main() mit einem Befehl namens 'jmp' angesprungen.

Was passiert also, wenn Sie in Xcode kompilieren und starten? Zuerst konvertiert gcc/Clang den Code in Assembly \ machine code. Zweitens lädt Xcode die Binärdatei in den Speicher. Drittens erkennt Darwin (OS X oder iOS oder irgendein Betriebssystem für diese Angelegenheit), dass dies ein ausführbarer Speicherbereich ist, und beginnt von der Spitze des Befehlssatzes und durchläuft jeden Befehl.

Um Ihre Frage zu beantworten, wird die main()-Funktion von der CPU gestartet. Dies unterscheidet sich von Java, das über einen plattformunabhängigen Befehlssatz verfügt, der in der JVM "emuliert" wird.

This Frage hat eine gute Antwort, die erklärt, wie die main() Funktion in Assembler-Code übersetzt wird.

2

In den meisten Systemen besitzt das Betriebssystem spezielle Funktionen, um ausführbare Programme in den Speicher zu laden. Sie ordnen den erforderlichen Speicher zu und laden die Informationen aus der Datei in diesen Speicherbereich. In einigen Fällen können sie sogar spezielle Änderungen an dem Code vornehmen, so dass er in dem spezifischen Speicherbereich arbeitet, in dem er geladen wird.

Nach dem Laden des Programms in den Speicher übergibt das Betriebssystem die Steuerung an den Anfang des Codesegments der Programmdatei. Der Anfang des Codesegments hat normalerweise eine kleine Routine, die einige notwendige Operationen wie das Initialisieren des Stapels und des Speicherzwischenspeichers ausführt. Wenn diese Dinge erledigt sind, übergibt es die Kontrolle an die Funktion main().