First of all, when debugging and running in Xcode, everything works as expected.
But when I try to "share" my application, i.e. to build the releases, my NSTask will not output any standard record until standard errors are issued. How is this possible?
My code
- (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]; }
ThomasM
source share