2010-08-05 2 views
2

내 코코아 응용 프로그램에서 불안정한 수정 불가능한 코드를 사용하는 작업을 실행해야합니다. 입력이 적고 나머지 앱과는 독립적으로 작동하며 결과적으로 수천 개의 ObjC 객체가 생성됩니다.Mac Cocoa 응용 프로그램을 충돌 방지

어떻게 불안정한 부분을 실행하고 전체 응용 프로그램을 중단하지 않고 충돌을 일으킬 수 있습니까?

fork() 코코아 신청 가능합니까? UI, 스레드, GC, KVO, runloops가 분기 될 때 어떻게 동작할까요?

NSTask을 통해 실행되는 독립 실행 형 실행 파일을 만들지 않도록 할 수 있습니까?

별도의 프로세스를 시작하면 어떻게 ObjC 객체 인스턴스를 보내고받을 수 있습니까? (나는 직렬화하지 않을 것이다/그들 자신을 unserialize, 나는 자식 프로세스가 끝난 후에 그것들을 유지할 필요가있다).

OS X은 Spotlight 및 Quicklook 플러그인에 대해이 문제를 어떻게 처리합니까?

+3

왜 불안정하고 수정할 수 없습니까? 왜 그런 프로그램을 사용하겠습니까? 왜 안정시킬 수 없습니까? 당신은 틀린 질문을하고 있을지도 모른다. 아마 내가 어떻게 나의 app을 증명할 수 있을까? 어쩌면 "어떻게이 불안정한 코드를 고칠 수 있습니까?" – Jasarien

+2

코드를 수정할 수 없다고 가정하십시오. 내 이유에 대해 논쟁하고 싶지 않아. 나는이 솔루션이 제 3 자 플러그인, 폐쇄 소스 라이브러리 또는 비정상적인 오래된 OS API와의 호환성을 필요로하는 다른 사람들에게도 흥미로울 것이라고 생각한다. – Kornel

답변

2

포크() 코코아 응용 프로그램을 사용할 수 있습니까?

네,하지만 대부분 즉시 exec해야합니다. 포크와 exec 사이 (또는 전혀 실행하지 않고) 특정 코코아 메서드 또는 CF 함수를 사용하려고하면 Core Foundation에서 예외가 발생합니다. 예를 들어, 창문에 창문을 열어 볼 수있는 물건을 가지고 도망 갈 수도 있지만 아무 것도 안전하지 않습니다.

물론 NSTask를 시작하면 fork와 exec가 함께 계산되므로 exec를 건너 뛰거나 연기하는 문제를 피할 수 있습니다.

UI, 스레드, GC, KVO, 런 루프가 분기 될 때 어떻게 동작할까요?

UI : Windows (실제 화면의 것)는 복제되지 않습니다. 물론 NSWindow 및 NSView 객체와 대화 할 수는 없습니다.

스레드 : 하위 프로세스로 이월되지 않습니다. 문제 사례가 많아서 This is not as good as it may sound; 하나의 스레드에 대해 다른 스레드가 부모에서 잠금을 개최했을 수 있습니다.이 잠금은 스레드를 보유한 스레드가 부재하더라도 잠금 상태로 남아 있습니다.

GC : 음, 가비지 컬렉터가 ... 스레드에서 실행

KVO : 관찰은 일반적으로 명시 적으로 또는 KVO 제공 래퍼 접근에 의해 유발되기 때문에, 잘해야한다.

루프 실행 : 스레드 당 하나이므로 주 스레드의 실행 루프가 여전히 존재해야하지만 되돌아 가면 종료됩니다.

NSTask를 통해 실행되는 독립 실행 형 실행 파일을 만들지 않도록 할 수 있습니까?

아니.

별도의 프로세스를 시작하면 어떻게 ObjC 객체 인스턴스를 보내고받을 수 있습니까?

exec가 아닌 사용자는 그렇지 않습니다.

그렇지 않으면 DO를 사용할 수 있습니다.

(나는 직렬화/직렬화를하지 않으려 고합니다. 자식 프로세스가 끝난 후에도 유지해야합니다.)

그런 다음 상위 프로세스에서 사본을 만들어야합니다. 여기에 copyWithZone:을 사용할 수 있는지 여부는 알 수 없습니다. 아마. 나는 당신이 일종의 plist- 또는 archive-based serialization/unserialization을해야 할 것이라고 생각한다.

OS X은 Spotlight 및 Quicklook 플러그인에 대해이 문제를 어떻게 처리합니까?

스포트라이트에 mdworker가 있습니다. 훑어보기는 비슷한 것을 가지고 있습니다.

+0

입니다. posix_spawn()은 fork/exec에 대한 현대적인 대안입니다. NSTask가 내부적으로 사용하고 있다고 생각합니다. – neoneye

+0

자세한 답변을 보내 주셔서 감사합니다. 그래서 그것을 요약하자면 :'NSTask' +'NSKeyedArchiver'는 갈 길입니까? – Kornel

+2

나는 그렇게 말하고 싶다. 양쪽에서 사용자 정의 클래스의 인스턴스를 보내려는 경우 해당 클래스에 NSCoding을 구현해야합니다. –

1

나는 내 코코아 프로그램과 별도의 (신뢰할 수없는) 작업자 프로그램간에 통신하는 데 Distributed Objects을 사용합니다. 나는 NSTask로서 노동자를 시작한다. 분산 객체는 매우 우아하게 결합됩니다.

+0

분산 객체 설명서에는 연결이 끊어지면 객체가 존재하지 않는다고 설명되어 있습니다. 작업을 빨리 끝내고 싶지만 개체를 ​​주 프로세스에 보관하십시오. 어떻게해야합니까? – Kornel

+0

가 존재하지 않는다 ... 나는 당신이 무엇을 요구하고 있는지 정확히 알지 못합니다. 내 임무는 오래 살았고 문제없이 DO를 통해 메서드를 호출 할 수 있습니다. DO는 모든 요청을 serialize/unserialize 할 것이므로 동일한 프로세스 내에서 객체와 상호 작용하는 것처럼 코드가 정확하게 보입니다. 작업이 매우 짧고 IPC에 STDIN 및 STDOUT을 사용하는 경우 가장 좋은 예는 http://developer.apple.com/mac/library/samplecode/Moriarity/Introduction/Intro.html – neoneye

관련 문제