7

Cocoa プログラムで int main 関数が果たす役割は何ですか? 私が見てきたほとんどすべてのサンプル コードは、main.m に次のコードしかありません。

#import <Cocoa/Cocoa.h>


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

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

これは正確には何をしていて、プログラムは実際にコマンドのステップ実行をどこから開始するのでしょうか? 私の概念は再調整が必要なようです。

4

5 に答える 5

12

Cocoa プロジェクトは他のプロジェクトと同様に開始されるため、オペレーティング システムのエントリ ポイントはメインです。ただし、Cocoa アーキテクチャは、NSApplicationMain からプログラムの処理を実際に開始するように構築されています。NSApplicationMain は、アプリケーションから初期ウィンドウをロードし、GUI イベントの処理に使用されるイベント ループを開始します。

Apple は、Cocoa Fundamentals Guide の下でこれについて非常に詳細な議論を行っています: Mac OS X のコア アプリケーション アーキテクチャ

于 2010-01-21T17:07:21.940 に答える
5

「これを起動」からmain()関数に制御がどのように渡されるかを知りたい場合は、execveのマニュアル ページに詳細があります。dyldについても読みたいと思うでしょう。 main()Unix 標準の一部です。効果的に実行できるすべてのプログラムには、main().

他の人が述べたように、NSApplicationMain制御を Cocoa に渡します。ドキュメントは、それが何をするかについて非常に具体的です。

興味深いことに、NSApplicationMain実際にはすべてが返されるわけではありません。つまりNSApplicationMain、関数の呼び出しと戻りを分離しmain、その間にコードを挿入すると、そのコードは実行されません。

于 2010-01-21T17:39:47.653 に答える
4

main() は、プログラムのエントリ ポイントです。

プログラムを実行すると、最初に呼び出される関数です。その関数を終了すると、プログラムは終了します。

また、これは Objective-C からのものではないことに注意してください。これは単純な C です。

ウィキペディアのページを見て ください

于 2010-01-21T17:04:40.883 に答える
0

mainから返された値は、プロセスが完了すると、プロセスによってオペレーティングシステムに返されます。

シェルは最後のプロセスによって返された値を保存し、次のようにして元に戻すことができます$?

> ls
a b c

> echo $?
0

> ls x
x: No such file or directory

> echo $?
1

lsは他のアプリケーションと同じです。

戻り値を使用して、シェルスクリプトなど、プロセスを実行して戻り値を確認できるものを使用して、複数のプロセスをチェーン化できます。

于 2010-01-21T22:06:54.297 に答える
0

コードがどこで実行を開始するのか疑問に思っています (NSView サブクラスが実行され、明示的に呼び出されずに描画されるのはなぜですか?) また、メインループを int main() に固定する必要がない場合は、どこに行くのでしょうか?

xcode プロジェクトには、「int main」関数を含む main.m ファイルがあります。NSView 描画を明示的に呼び出すコードは実際には見つかりません。このコードは、iPhone または Mac OS X フレームワークの奥深くに隠されています。「int main」の奥深くにイベントループが隠されていることを知っておいてください。変更をチェックして、いつビューを更新するかを認識します。このイベント ループがどこにあるかを知る必要はありません。メソッドをオーバーライドしたり、これが発生したときに処理を実行できるデリゲートを作成して割り当てることができるため、有用な情報ではありません。

より良い答えを得るには、「int main」関数内に入れたい「メイン ループ」の意味を説明する必要があります。

C++ の経験が少しある私にとっては、奇妙なことです。main 関数が空っぽになるのは不自然に見えます。

10 億行のコードを 1 つの関数にカプセル化し、それを「int main」に入れることができます。メインが数行しかないことに惑わされないでください。これは意図的に行われています。優れたプログラミングは、コードを特定のコンテナーに保持して、適切に整理することを教えてくれます。Apple は、main.m ファイル内の次の 1 行のコードで、iPhone アプリの「実際の」起動ポイントを作成することを選択しました。

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

その 1 つのコードからアプリのデリゲートが起動され、それが完了するまでメイン関数に制御が返されません。

于 2010-01-21T22:24:28.813 に答える