목적 C 함수 디스패치 충돌; 아니면 "네임 스페이스"를 달성하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1474626

문제

동시에로드 할 플러그인을 지원하는 Mac OS X에 대한 응용 프로그램이 있습니다. 이 플러그인 중 일부는 코코아 프레임 워크 위에 구축되어 하나의 플러그인으로는 업데이트를받을 수 있지만 다른 플러그인은 아닙니다. Objective-C의 기능 파견 방법이 주어지면 플러그인에서 주어진 Objective-C 루틴으로의 호출은 매번 동일한 루틴으로 이동합니다. 즉, 플러그인 A가 자체적으로 찾을 수 있습니다 내부에 사소한 목표 C 호출이있는 플러그인 B! 분명히 우리가 찾고있는 것은 각 플러그인이 자체 버전의 프레임 워크와 상호 작용하는 것입니다. 가지다 계속 ~ 이다 독서 일부는 Objective-C 와이 특별한 요구에 있지만 아직 결정적인 솔루션을 찾지 못했습니다.

업데이트 : 위의 "프레임 워크"라는 단어를 사용하는 것은 오해의 소지가 있습니다. 프레임 워크는 정적으로 연결된 라이브러리로 플러그인에 내장되어 있습니다. 그러나 목표 C가 파견을 처리하는 방식은 이러한 정적으로 연결된 이종 코드의 조각조차도 대공 C 디스패처에서 공동으로 조정하여 의도하지 않은 결과를 초래할 것입니다.

업데이트 2 : 나는 여전히 약간 퍼지 여기에 제공된 답변, 그것은 입증되지 않은 가설만큼 솔루션을 제안하지 않는 것 같습니다.

도움이 되었습니까?

해결책 3

지금까지 가장 좋은 솔루션은 제안 된 아이디어에서 파생되는 것입니다. 이 질문

다른 팁

대상 C는 현재 네임 스페이스 개념이 없으며 런타임은 단일 (글로벌) 디스패치 테이블만을 나타냅니다.

이것은 대상 C에 고유하지 않으며 C 기반 플러그인조차도 모든 것이 동일한 주소 공간에 있기 때문에 서로 상당히 사소하게 호출 할 수 있습니다. 물론 실수로 걱정이된다면 2 단계 네임 스페이스로 인해 가능성이 적지 만 일부 플러그인이 명시 적으로 다른 코드를 입력하려고 시도하면 보호하지 않습니다.

플러그인을 분리하려면 플러그인을로드하는 코드를 실행하고 응용 프로그램 자체와 도우미 앱간에 RPC를 수행하도록하는 별도의 도우미 프로세스를 만들 수 있습니다. 예를 들어 Safari가 Snow Leopard에서 64 비트에서하는 일입니다. 이 접근법에는 여러 가지 이점이 있지만 구현하는 것은 상당히 복잡하며 대부분의 직접 굴러 가야합니다.

"플러그인 A가 플러그인 B에서 자체적으로 찾을 수 있습니다"에 대한 의견을 이해하지 못한다고 생각합니다. 일단 종속 프레임 워크를 한 번로드 한 후에는 모든 사람이 자신의로드하는 대신 사용을 사용한다고 생각합니다. 그리고 네임 스페이스와 같은 것이 있는지 여부는 맞습니다.

하나의 플러그인에 하나의 OpenSSL 버전이 필요하고 다른 플러그인 버전의 OpenSSL이 필요한 경우에 직면하는 것과 동일한 문제입니다. 동일한 기호를 제공하는 두 개의 라이브러리를로드 할 수 없습니다.

문제를 이해합니까? 다양한 플러그인에는 동일한 프레임 워크의 다르고 호환되지 않는 버전이 필요합니까? 가능한 경우 필자의 접근 방식은 프레임 워크를 정적 라이브러리로 변경하고 플러그인을 프레임 워크에 정적으로 연결하는 것입니다. 플러그인간에 프레임 워크를 공유하지 않으면 프레임 워크가 실제로 원하는 것이 아닙니다. 코드를 컴파일하려고합니다 (정적 링크). 프레임 워크의 요점은 공유하는 것입니다.

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