Nstask 사용 : 출력을 반환 한 후 앱 동결
-
12-09-2019 - |
문제
안녕하세요 다음 코드가 있습니다.
- (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];
이 라인 자체는 출력을 콘솔에 로그인 한 다음 앱을 얼립니다. 그 라인 뒤에 다른 모든 줄을 삭제하여 이것을 확인했으며 여전히 출력과 동결을 기록합니다. 디버거에는 아무것도 없으며이 문제를 해결하는 방법에 대한 제안은 크게 감사 할 것입니다.
해결책 2
이 문제에 대한 해결책은 간단했습니다.
Nstask가 실행 된 후 모든 로깅이 작동하지 않는 알려진 버그입니다. 그것은 출력을 반환하고 있습니다. 해결책은이 라인을 추가하는 것이 었습니다.
[task setStandardInput:[NSPipe pipe]];
그리고 모든 것이 잘 작동합니다 :)
다른 팁
당신이 놓친 것 같습니다
[proc setStandardOutput:output];
마지막 SED 진술의 끝에 추가 슬래시가 있습니다. 일단 제거하면 스크립트가 잘 작동합니다.
출력은 [NSPIPE 파이프] (Uneaded)로 생성해야하며 [Proc SetstandardOutput : output]을 사용한 표준 출력으로 출력을 설정해야합니다.
그러나 당신이 충돌하는 이유는 당신이 당신이 할당하지 않은 데이터를 공개하거나, 새롭거나 복사하지 않았기 때문입니다. 참조 메모리 관리 규칙.
또한 참조하십시오 Nstask의 Quickies 이 코드를 잘 구현하려면.