Не удается прочитать стандартный вывод из 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. Я вижу стандартный вывод моей задачи в консоли, и полученный OutputFromAlgo получен несколько раз. Однако, если я архивирую приложение и запускаю его, дважды щелкнув по пакету.app или запустив его из терминала, это не сработает. Я все еще вижу выход задачи через консоль или приложение терминала, если я запускаю его оттуда.

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

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

1 ответ

Вам нужно обработать setStandardError, вот так:

[task setStandardError:outputpipe];
Другие вопросы по тегам