5

Objective-C で main メソッドを呼び出すのは誰か知りたいですか?

UIApplicationMain(nil,nil,nil,NSStringFromClass[Appdelgate class]) メソッドが main() メソッドから呼び出され、プロセスが appdelegate didFinishLaunchingWithOptions() メソッドから続行されることを知っています.....

また、Javaのmain()メソッドがJVMによって呼び出され、main()メソッドからプロセスが進行していることも知っています。

そのように、objective-c で main() を呼び出すのは誰かを知りたいです。

手伝ってくれてありがとう

4

4 に答える 4

3

簡単に見つける方法は、ブレークポイントを挿入して確認することmain()です。

コールスタック

したがって、技術的には、質問に対する答えは、main()と呼ばれるものから呼び出されるということstartです。のソースコードは取得できませんが、start必要に応じてデバッガーでアセンブリコードを確認できます。このバージョンは、シミュレーター用にビルドされたコードからのものです。

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   

MacOS Xコマンドラインプログラムを作成し、にブレークポイントを設定すると、デスクトップでも呼び出されmain()ます。Mac版のアセンブリは完全に同じではありませんが、非常に近いです。したがって、ターゲットプラットフォームに基づいてコンパイラによって生成されるのは適切な推測であり、オペレーティングシステムがプログラムを起動するときに探すエントリポイントです。main()startstartstartstart

于 2012-07-18T15:10:07.013 に答える
2

ほとんどのシステムでは、OS には実行可能プログラムをメモリにロードする特別な機能があります。必要なメモリを割り当て、ファイルからその領域に情報をロードします。場合によっては、コードがロードされている特定のメモリ空間で動作するように、コードに特別な変更を加えることさえあります。

プログラムをメモリにロードした後、OS は制御をプログラム ファイルのコード セグメントの先頭に渡します。通常、コード セグメントの先頭には、スタックやメモリ ヒープの初期化など、いくつかの必要な操作を行う小さなルーチンがあります。これらの処理が完了すると、制御が main() 関数に渡されます。

于 2012-07-18T14:45:25.537 に答える
2

Cと同じですが、Cランタイムライブラリを使用して、Obj-Cランタイムライブラリからアセンブリルーチンによって呼び出されると思います

これを確認してください:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

于 2012-07-18T14:38:37.250 に答える
1

Objective-C は C の派生物であるため、内部構造の多くは類似しています (これが、C\C++ コードを Objective-C に混在させることができる理由です)。そのため、両方が実行可能ファイルにコンパイルされると、同様のシステムで動作します。これは、Objective-C が gcc または Clang によってコンパイルされる理由でもあります。

それを念頭に置いて、コンパイルするとどうなりますか? すべての C コードが Assembly\machine code に変換されます (Assembly は単なるマシン コードのニーモニック バージョンであるため)。アセンブリは Java よりも低いレベルにあります。CPU はそれを実行し、個々の命令を順番に実行します。C言語のmain()関数は、コンパイラが命令の開始位置を「知っている」場所です。すべての宣言を行った後、main()関数は ' ' という命令でジャンプしjmpます。

では、Xcode でコンパイルして起動するとどうなるでしょうか。まず、gcc/Clang はコードを Assembly\machine コードに変換します。次に、Xcode はバイナリ ファイルをメモリにロードします。3 番目に、Darwin (OS X または iOS、またはその他の OS) は、これがメモリの実行可能領域であることを認識し、命令セットの先頭から開始して各命令を実行します。

あなたの質問に答えるために、main()関数は CPU によって開始されます。これは、JVM で「エミュレート」されるプラットフォームに依存しない命令セットを持つ Java とは異なります。

Thismain() questionには、関数がアセンブリコードにどのように変換されるかを説明する素晴らしい答えがあります。

于 2012-07-18T14:42:19.013 に答える