안에있는 NSTask
을 실행하려고 잠시 도망 쳤습니다.왜 자동 복구 된 NSTask가 NSOperation 스레드의 runloop을 무기한 차단합니까?
다음은 very simple app입니다. 문제를 보여주기 위해 함께 사용했습니다. 단추를 클릭하면 NSOperation
이 대기합니다. NSRunLoop
을 설정하고 NSTask
을 호출하는 메소드를 호출합니다. 이 작업은 실제로 간단합니다. 단지 /bin/sleep
을 2 초 동안 실행합니다 (정상적으로 작동 할 때 회 전자를 쉽게 볼 수있을만큼).
응용 프로그램이 광고 된 것처럼 작동하지만 TaskPerformer.m의 23 번째 줄을 autorelease
으로 변경하면 (미안하지만 직접 연결할 수 없기 때문에 새로운 포스터입니다.) 또는 전체적으로 주석 처리합니다. NSTask
개체), NSOperation
의 스레드는 절대로 종료하지 않습니다. 그 주요 runloop 뭔가를 차단하는 것 같습니다.
이제 문제는 두 가지입니다. 우선, 왜 스레드가 차단되고 있는지 이해할 수 없지만,이 애플리케이션의 가비지 수집을 켜면 동일한 동작이 나타납니다. NSTask
을 수동으로 릴리스 할 수있는 방법이 없기 때문에 스레드는 무엇을 막론하고 블록합니다.
누군가가 내게 어떤 일이 일어 났는지 말해 줄 수 있다면, 영원히 감사 할 것입니다!
지적 해 주셔서 고마워요, 브라이언. 나는 이미 그것을 보았고, 업데이트 된 코드를 Github에 푸시하지 않았을뿐입니다.이제 해결되었습니다. 'NSRunLoop'은 실제 응용 프로그램에서 필요합니다. 왜냐하면'NSTask'의 무리를 시작하는 것 외에도 콜백에 NSRunLoop이 필요한 비동기 NSURLConnection을 사용하기 때문입니다. 흥미로운 점은 'waitUntilExit'에 대한 호출을 제거하면 스레드가 처음에는 종료되지만 이후에는 종료하지 않는다는 것입니다. 뭔가 이상하게 보입니다. – texel