Не удается прочитать стандартный вывод из NSTask в режиме выпуска

Я читаю стандартный вывод 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 или в терминале, если я запускаю ее оттуда.

Разве это не считается стандартным выводом на данный момент? Почему это не сработает?

Изменить: я только что попытался отключить оптимизацию в выпуске, и это тоже не сработало.


person Artelis    schedule 17.09.2014    source источник


Ответы (1)


вам нужно обработать setStandardError, например:

[task setStandardError:outputpipe];
person danny-source    schedule 22.09.2014