Я читаю стандартный вывод NSTask так:
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
}
Это отлично работает, если я запускаю это из Xcode. Я вижу stdout моей задачи в консоли, и ReceiveOutputFromAlgo срабатывает несколько раз. Однако, если я архивирую приложение и запускаю его, дважды щелкнув пакет .app или запуская его из терминала, оно не работает. Я все еще вижу, как задача stdout проходит в console.app или в терминале, если я запускаю ее оттуда.
Разве это не считается стандартным выводом на данный момент? Почему это не сработает?
Изменить: я только что попытался отключить оптимизацию в выпуске, и это тоже не сработало.