2011-04-06 3 views
0

내 iPhone 응용 프로그램에서 사용하려는 응용 프로그램 용 C 소스 코드가 있습니다. 가장 좋은 방법은 서브 클래스에서 NSOperation 하위 클래스의 해당 C 응용 프로그램의 기본 메서드를 호출하는 것이라고 생각했습니다.NSOperation에서 exit()를 처리하는 방법

C 응용 프로그램의 무언가가 잘못되어서 exit()/abort()이 호출되는 경우를 제외하고는이 기능이 정상적으로 작동합니다. 이는 내 iPHONE 응용 프로그램을 다운시킵니다.

C 코드는 매우 길며 어떤 식 으로든 방해하거나 방해하고 싶지 않습니다. 내가 그 우회 할 수 있는지 알고 싶습니다 NSOperationexit()/abort() 호출 그래서 그냥 스레드 및 전체 응용 프로그램을 종료합니다.

답변

0

-Dexit = my_exit -Dabort = my_abort 옵션으로 컴파일하고 my_exit 및 my_abort를 다음과 같이 구현하는 방법은 무엇입니까?

void my_exit(int status) 
{ 
    if (!/* check thread ID or so forth, and check during calling the NSOperation */) { 
     exit(status); 
    } 
} 
+0

안녕하세요, 응답 주셔서 감사합니다, 내가 Xcode에서 이것을 어떻게 설정합니까? – jAmi

+0

빌드 설정에서 "기타 C 플래그"를 "-Dexit = my_exit -Dabort = my_abort"로 설정하십시오. –

+0

어쨌든 충돌합니다 ... – jAmi

0

당신은 당신이 당신의 자신의 exit()abort() 기능을 추가 할 수있는 C 코드를 직접 컴파일 할 때, C 코드가 다음 라이브러리에있는 사람이 아닌 사람들을 호출합니다. Obj-C 코드에 적절한 상태를 전달하고 스레드를 닫도록 정의하십시오. 당신이 NSTask를 사용하려면 물론 실제 분리를 위해

... 내가 exit()에 대한 가능성이 동일 abort() 이후에 수행 할 수있는 실제적인 방법이라고 생각하지 않습니다

+0

내가 언급했듯이 나는 C 코드를 조정할 수 없다. NSTask는 iOS SDK에서 지원되지 않습니다. – jAmi

+0

iPhone 앱에서 NSTask를 사용할 수 있습니까? – JeremyP

+0

@ JeremyP, jAmi - 올바른 'NSTask'는 사용할 수 없지만 실제 분리를 위해 필요한 것입니다 ... 마지막 줄은 분명히 혼란스러운 설명을 전달하는 것입니다 :-( – CRD

0

. 두 호출은 실제로 프로세스를 종료합니다. 즉, 원래 프로그래머가 할당 된 리소스와 파일 설명자 등을 정리하지 않아도된다는 것을 의미합니다. 따라서 프로세스 대신 스레드를 종료하더라도 응용 프로그램이 거의 확실히 체로 누출됩니다 재정의 된 exit()/abort()가 호출 될 때마다

더 심각하게도 프로그램이 abort()를 호출하면 실행 시간 또는 프로그래머 오류로 인해 복구 할 수없는 문제가 감지되었을 가능성이 있습니다. 예를 들어, 버퍼 오버런으로 인해 힙이 손상되었을 수 있습니다. 따라서 상황을 복구하는 것이 불가능할 수 있습니다.

exit()abort()의 모든 항목을 감사해야 스레드가 종료되는 것이 안전한지 알 수 있습니다.

+0

필요하다면 청소는 확실히 문제입니다. 열린 파일 디스크립터를 닫는 것은 너무 어렵지는 않지만, malloc과 친구들이 사용한 메모리를 되 찾는 일은 좀 더 어려울 것이다. 나는 당신이이 경로를 가면 앱 스토어 규칙의 위반이 일어날지도 모른다는 것을 알 수있다. 그러나 단순히 abort()를 잡아서 메인 쓰레드를 완전히 종료 시키거나 C 코드가 많은 것을 할당하지 못하도록하려는 경우 메모리가 부족하고 누수와 함께 살 수 있다면이 경로를 사용할 수 있습니다. 그러나 올바르게 말하면 C 코드가 무엇인지 알 필요가 있습니다! – CRD

+0

잊어 버렸습니다 : 물론 C 코드가 거칠어지고 메모리에 쓰는 것을 막을 수있는 완전한 방법은 없습니다.하지만 Obj-C에서도 마찬가지입니다. – CRD