Привет У меня есть следующий код:Использования NSTask: приложение замораживание после возвращения выхода
- (IBAction)runTask:(id)sender {
NSTask *proc;
NSPipe *output;
NSData *data;
NSString *buffer;
proc = [[NSTask alloc] init];
output = [[NSPipe alloc] init];
[proc setLaunchPath:@"/bin/sh"];
[proc setArguments:[NSArray arrayWithObjects: @"-c", @"/usr/bin/otool -L /Applications/TextEdit.app/Contents/MacOS/TextEdit | /usr/bin/awk 'NR>1{print $1}' | /usr/bin/sed -e '/@executable_path/d' -e 's/(.*)$//' -e 's/\\/Versions.*$//'", nil]];
[proc launch];
data = [[output fileHandleForReading] readDataToEndOfFile];
buffer = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"got: %@", buffer);
// Release
[proc release];
[output release];
[buffer release];
[data release];
}
кода цель является своим родом сложной, он использует otool, чтобы получить список разделяемых библиотек, используемых двоичные файлы, то он использует sed и awk, чтобы отфильтровать его в машиночитаемом формате. Просто для тестирования я использовал двоичный файл Mac OS X TextEdit.app.
Проблема в том, что код запускается и возвращает результат, но затем замораживает приложение. Я прошел через него по строкам и нашел эту проблему проблемой:
data = [[output fileHandleForReading] readDataToEndOfFile];
Эта строка сама регистрирует вывод на консоль и затем замораживает приложение. Я проверил это, удалив все остальные строки после этой строки и все еще записывает выходные данные и зависает. В отладчике нет ничего, и любые предложения о том, как решить эту проблему, будут очень благодарны.
Я скопировал код в инструмент командной строки, добавил недостающую 'setStandardOutput:' сообщения, и побежал. Он отлично работает, за исключением того, что вы заканчиваете «данные» в конце. –
«Я проверил это, удалив все остальные строки после этой строки ...» Вместо этого я предлагаю выборку вашего приложения. См. Образец человека 1. –