2012-02-27 7 views
1

多くのことを行うCocoaアプリケーションがありますが、それらの中でXCodeでiOSプロジェクトをクリーンアップして再構築します。 Cocoaアプリケーションは、XCode 4.1を使用して開発され、OS X 10.7(NSTask終了ハンドラのため)でのみ動作します。私は数ヶ月間触れていませんでした.XCode 4.2にアップグレードした後、xcodebuildを実行した最初のNSTaskだけが実際に何かをしたことがわかりました。その後の呼び出しは何も行いません。Cocoaアプリケーションからxcodebuildを2回実行すると(NSTask経由で)自動的に失敗します。

いくつかの詳細:

  • は、構築されるiOSのプロジェクトは、ココアアプリのリソースバンドルの中に座っています。基本的に、CocoaアプリはiOSプロジェクトのラッパーです。大きな赤いボタンがあるGUIを想像してみてください。「iOSアプリケーションを作ってください!」
  • このコードはXCode 4.1で完全に機能しました。タスク1が実行され、タスク1の終了ハンドラでタスク2が呼び出され、正常に実行されました。問題は、タスク2はもはや実行されないということです。
  • その後私はxcode 4.3にアップグレードしました。これは、スタンドアロンのXcodeコマンドラインツールもインストールする必要がありました。しかし、コードはまだ正しく動作しません。
  • 端末で「xcodebuild clean」と「xcodebuild」の両方のコマンドを問題なく実行できます。

以下は、違反コードの(言い換え)バージョンです。

#import "AppDelegate.h" 

@implementation AppDelegate 
@synthesize window = _window; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    [self runTaskOne]; 
} 

// Clean the iOS Project 
- (void) runTaskOne 
{ 
NSTask *task = [[NSTask alloc] init]; 
[task setCurrentDirectoryPath:@".../myproject/DerivedData/myproject/Build/Products/Debug/myproject.app/Contents/Resources/iOSProjectFolder"]; 
[task setLaunchPath:@"/usr/bin/xcodebuild"]; 
[task setArguments:[NSArray arrayWithObjects:@"clean", nil]]; 
[task setTerminationHandler:^(NSTask *task) 
{ 
    [self runTaskTwo]; 
}]; 
[task launch]; 

} 

// Build the same iOS project that was just cleaned 
- (void) runTaskTwo; 
{ 
NSTask *task = [[NSTask alloc] init]; 
[task setCurrentDirectoryPath:@".../myproject/DerivedData/myproject/Build/Products/Debug/myproject.app/Contents/Resources/iOSProjectFolder"]; 
[task setLaunchPath:@"/usr/bin/xcodebuild"]; 
[task launch]; 
} 

@end 

タスク1(クリーン)はうまく動作します。タスク2(ビルド)は起動していないようです。この動作は、XCode 4.2にアップグレードした後にのみ発生します。私は間違った何かをしているに違いないが、何?

+0

ARCを使用してプロジェクトを行っていますか? –

+0

です。実際には、タスク1のterminationHandlerが決して実行されないことに気付きました。 ... Aaand検索の少し後、私は答えを見つけました。今すぐ書いてください。 – churowa

答えて

1

、これに似た何か:NSTaskは既に一度起動されている場合 NSTask NSPipe - objective c command line help

は基本的には、XcodeはNSTaskの出力を保持します。

ソリューションは以下のようなものを、タスクの標準入力を切り替えることだった:

[task setStandardInput:[NSPipe pipe]]; 

をできるだけ早く私はrunTaskOneメソッドにこれを入れて、すべてがうまく仕事を始めました。

0

プロジェクトでARC(Automatic Reference Counting)を使用している場合、NSTaskインスタンスはrunTaskOneメソッドの最後に自動的に解放されます。したがって、プロセスを監視するはずのオブジェクトが存在しないため、補完ハンドラは呼び出されません。

タスクへの参照は、インスタンス変数に格納しておく必要があります。私はXcodeでバグに遭遇したかのように思え

+0

ニコラスの返事をありがとう。私が見つけたのは、パイプを標準入力としてタスクに追加することです: '[task setStandardInput:[NSPipe pipe]];は問題を解決します。終了ハンドラが実行され、すべてが正常です。 – churowa

関連する問題