首先,在Xcode中调试和运行时,一切都按预期工作。
但是当我尝试“共享”我的应用程序时,即进行发布构建时,我的NSTask将不会输出任何standardOutput,同时标准错误被释放。怎么可能?
我的代码
- (id)initWithWindow:(NSWindow *)window {
self = [super initWithWindow:window];
if (self) {
// Initialization code here.
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readPipe:) name:NSFileHandleReadCompletionNotification object:nil];
return self;
}
-(void) watchFile:(NSNotification *)notification {
NSString *path = [[notification userInfo] valueForKey:@"path"];
task = [[NSTask alloc] init];
[task setLaunchPath:@"/usr/bin/compass"];
[task setCurrentDirectoryPath:path];
NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"watch",@"--boring", nil];
[task setArguments: arguments];
NSPipe *outPipe, *errPipe;
outPipe = [NSPipe pipe];
errPipe = [NSPipe pipe];
[task setStandardOutput: outPipe];
[task setStandardError: errPipe];
[task setStandardInput: [NSPipe pipe]];
standardHandle = [outPipe fileHandleForReading];
[standardHandle readInBackgroundAndNotify];
errorHandle = [errPipe fileHandleForReading];
[errorHandle readInBackgroundAndNotify];
[self setSplitterPosition:0.0f];
[task launch];
}
-(void)readPipe:(NSNotification *)notification {
NSLog(@"reading pipe");
NSData *data;
NSString *text;
if(!([notification object] == standardHandle) && !([notification object] == errorHandle)) {
return;
}
data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
text = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
if ([data length] == 0) {
//error
[self setSplitterPosition:150.0f];
return;
}
[terminalViewController updateTerminal:text];
if(![text isEqualToString:@"\n"]) [self growlAlert:text title:@"Compapp"];
[text release];
if(task) [[notification object] readInBackgroundAndNotify];
}
答案 0 :(得分:0)
/usr/bin/compass
不是OSX标准安装中安装的二进制文件(我的Mac上的compass
中没有任何名为/usr/bin
的二进制文件)
因此,当您的应用程序在另一台Mac上运行时 - 没有安装/usr/bin/compass
并且您尝试运行此任务时,它无法找到它并且只输出一些错误在stderr。
答案 1 :(得分:0)
如果您的意思是在发布后尝试调试,则需要创建一个名为Entitlements.plist的文件,并在构建和存档之前设置可以调试。
答案 2 :(得分:0)
如果这仍然是一个未解决的问题,请查看我在此链接上发布的答案:How to use a determinate NSProgressIndicator to check on the progress of NSTask? - Cocoa
它提供了一个很好的模板,用于创建异步NSTask以及从标准输出或标准错误中读取。