0

これが私のコードテンプレートです:

int main(int argc, char *argv[]) {
    // create an autorelease pool
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    // make sure the application singleton has been instantiated
    NSApplication * application = [NSApplication sharedApplication];
    // instantiate our application delegate
    AppDelegate * applicationDelegate =
                          [[[AppDelegate alloc] init] autorelease];
    // assign our delegate to the NSApplication
    [application setDelegate:applicationDelegate];
    // call the run method of our application
    [application run];
    // drain the autorelease pool
    [pool drain];
    // execution never gets here ..
    return 0;
}

「[pooldrain]」の後に「return0」が続くのはなぜ実行されないのか。

しかし、私は別のgnustepの公式例を見つけました。それは同じことをします。

int
main(int argc, char **argv, char** env)
{
  id pool = [NSAutoreleasePool new];
  NSApplication *theApp;

#if LIB_FOUNDATION_LIBRARY
  [NSProcessInfo initializeWithArguments:argv count:argc environment:env];
#endif

  theApp = [NSApplication sharedApplication];
  [theApp setDelegate: [browserController new]];
  [theApp run];

  [pool release];

  return 0;
}

「[theApprun]」が二度と戻らないことを証明するために、「[theApprun]」の直後に無限ループを追加して練習しましたが、実行されることはありません。なぜGNUSTEPオフィシャルの例がそのようなことをしたのですか?

4

1 に答える 1

4

[pool drain]それが実際にどちらかと呼ばれていると確信していますか?[application run]呼び出されない限り戻りません[NSApp stop](これはまれです)。ドキュメントが言うように、より一般的なもの[NSApp terminate]が呼び出された場合:

アプリケーションのmain()関数に最終的なクリーンアップコードをわざわざ入れないでください。実行されることはありません。クリーンアップが必要な場合は、デリゲートのapplicationWillTerminate:メソッドでそのクリーンアップを実行します。

アプリケーションをに渡した後はrun、通常、元に戻すことはできません。

于 2013-01-12T04:00:25.703 に答える