Cannot read stdout from an NSTask in release mode

304 Views Asked by At

I'm reading the stdout of an NSTask like so:

NSPipe *outputpipe = [[NSPipe alloc] init];
NSFileHandle *output = [outputpipe fileHandleForReading];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedOutputFromAlgo:) name:NSFileHandleReadCompletionNotification object:output];

NSTask* task = [[NSTask alloc] init];
[task setLaunchPath:[NSString stringWithFormat:@"%@algo/Algo", kVinylRoot]];
[task setArguments:[NSArray arrayWithObject:plist]];
[task setStandardOutput:outputpipe];
[task setCurrentDirectoryPath:[NSString stringWithFormat:@"%@algo", kVinylRoot]];

[task launch];
[output readInBackgroundAndNotify];
[task waitUntilExit];

...

-(void)receivedOutputFromAlgo:(NSNotification*)notification {
    [[notification object] readInBackgroundAndNotify];
    NSData* dataOutput = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
    NSString* dataString = [[NSString alloc] initWithData:dataOutput encoding:NSStringEncodingConversionAllowLossy];
    //Do stuff
}

This works just fine if I run this from Xcode. I see the stdout of my task in the console, and receivedOutputFromAlgo is hit multiple times. However, if I archive the app and run it by double clicking the .app package or run it from terminal it doesn't work. I can still see the task stdout coming through in console.app or in the terminal if I run it from there.

Is it not considered stdout at this point? Why would this not work?

Edit: I just tried turning off optimization in release and that didn't work either.

1

There are 1 best solutions below

0
On

you need handle the setStandardError, like this:

[task setStandardError:outputpipe];