我有一个Cocoa应用程序可以执行许多操作,但在其中,使用“xcodebuild
”来清理并重新构建XCode中的iOS项目。 Cocoa应用程序是使用XCode 4.1开发的,仅在OS X 10.7上运行(因为NSTask终止处理程序)。我几个月没碰过它,在我升级到XCode 4.2之后,我发现只有运行xcodebuild的第一个NSTask实际上做了什么。后续调用什么都不做。
一些细节:
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 :(得分:1)
似乎我遇到了Xcode中的一个错误,类似于: NSTask NSPipe - objective c command line help
基本上,如果NSTask已经启动一次,Xcode将保留NSTask的输出。
解决方案是切换任务的标准输入:
[task setStandardInput:[NSPipe pipe]];
只要我把它放到runTaskOne方法中,一切都开始运行得很好。
答案 1 :(得分:0)
如果您的项目使用ARC(自动引用计数),NSTask
实例将在runTaskOne
方法结束时自动释放。因此,永远不会调用完成处理程序,因为应该观察该进程的对象不再存在。
您需要通过将任务存储在实例变量中来保留对该任务的引用。