안녕 나는 다음과 같은 코드가 있습니다 :사용 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];
이 줄은 출력을 콘솔에 로깅 한 다음 응용 프로그램을 고정시킵니다. 나는 그 행 다음에 다른 모든 행들을 삭제함으로써 이것을 검사했고, 출력을 계속 기록하고 멈춘다. 디버거에는 아무 것도 없으며이 문제를 해결하는 방법에 대한 제안은 크게 감사 할 것입니다. 당신이
[proc setStandardOutput:output];
: '메시지를, 그것을 실행. 끝 부분에'데이터 '를 과도하게 릴리스한다는 점을 제외하고는 정상적으로 작동합니다. –
"그 줄 다음에 다른 줄을 모두 지워서 확인했습니다 ..."대신 앱을 샘플링하는 것이 좋습니다. 남자 1 견본을보십시오. –