문제

안녕하세요 다음 코드가 있습니다.

- (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 이 코드를 잘 구현하려면.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top