2010-03-21 3 views
1

그래서 임의의 변수를 가진 임의의 객체에 대해 임의의 메소드를 호출 할 수 있어야하는 곳에서 obj-c (나는 차라리 무엇을 말하지 않겠습니까)에서 작업하고 있습니다. 처음 두 가지는 충분히 쉽지만 가변 인수를 수행하는 방법은 확실하지 않습니다. 명확하게 말하자면, 가변 인수를받는 함수/메소드에 관한 것이 아니라 이 아닌 것입니다. objc_msgSendv (및 해당 변형) objective-c 런타임 및 NSInvocation에서 두 가지 방법을 발견했습니다. NSInvocation은 '모범 사례'와 같이 더 쉽고 더 많이 보이지만 objc_msgSendv는 더 빨리 처리해야하는 것처럼 들리지만 매번 완전히 다른 메시지를 사용하여 여러 번 반복해야합니다. 어느 것을 선택해야합니까? 좋은 이유로 objc_msgSendv 금기가 있습니까? (docs는 objc_msgsend 함수를 호출하지 않는다고 말합니다.)더 나은 방법 : objc_msgSendv 또는 NSInvocation?

P. 나는 모든 논증의 유형을 알고 있고 그들 모두가 이드가 아님

또한 (주요 질문의 일부가 아님) objc_msgSendv에서 super에 메시지를 보낼 방법이없는 것처럼 보입니다. 그것도 NSInvocation에서 그렇게 할 수있는 방법이 아닌 것 같습니다. 그래서 그것에 대한 도움도 될 것입니다.

답변

3

objc_msgSendv은 더 이상 사용되지 않습니다. 64 비트 Mac OS X 앱에서는 전적으로 사용할 수 없습니다. 따라서 관계없이 사용하지 마십시오.

진짜 질문은 컴파일 타임에 인수를 설정했는지 아닌지 여부입니다. 그렇다면 objc_msgSend (또는 해당 변형)을 사용하십시오.

그렇지 않은 경우 특정 대상 아키텍처와 관련된 C ABI를 준수하는 호출에 인수를 인코딩하는 메커니즘을 사용해야합니다. NSInvocation은 그렇게하는 가장 쉬운 방법이지만 오버 헤드가 있다는 점에서 옳습니다.

효율성을 높이기 위해 libffi으로 내려갈 수는 있지만 컴파일러가 코드를 컴파일하도록 대가로 대용량의 오버 헤드가 여전히 남아 있습니다.

인수와 반환 형식의 조합이 유한 한 경우 트램펄린 함수를 여러 개 컴파일하고 사용할 수 있습니다.

실제로 질문은 "무엇을하려고합니까?" 당신이 묘사하는 것은 상당히 비 전형적입니다. 아니, 당신이 아주 좋은 이유가 없을 지 모르는 것은 아닙니다. 그것이 무엇이든간에 (저에게, 어쨌든) 매우 흥미 롭습니다.

+1

감사합니다. obj_msgSendv가 가치 하락되었다는 것을 알지 못했습니다. 내가하고있는 일은 약간 인위적이지만 근본적으로 나는 iPad에서 코드를 작성할 수 없다는 점에서 약간의 누그러 뜨 렸습니다. 그래서 내가하고있는 일은 obj-c의 하위 집합에 대한 인터프리터를 작성하는 몇 가지 방법입니다. 따라서 앱 스토어를 공개하지는 않지만 기술적으로 Apple의 제한 사항을 위반하지는 않습니다. objective-c 런타임이 매우 동적이어서 (예를 들어, 문자열만으로 코코아/uikit을 호출 할 수 있기 때문에)이 점을 고려하는 것조차하고 있습니다. 아, 그리고 SDK에 가입하지 않았으므로 NDA를받을 수는 없습니다.) –

+0

Ahh ... 확인. 그러면 ffi는 iPhone 플랫폼에서 사용할 수 없습니다. iPad는 NDA에 속해 있습니다. 여기서 논의 할 수는 없습니다. 재미있는 프로젝트처럼 들립니다. 나는 너에게 행운을 빌어. 당신은 F-Script Anywhere를 보길 원할 것입니다, btw. – bbum

1

조기 조기 조심. 단위 테스트, 코드 및 디버그가 쉬울 것이므로 상위 수준의 기능 (NSInvocation)부터 시작하겠습니다. 그런 다음 측정을하십시오. 측정 결과에 NSInvocation (예 : 준비)과 같은 많은 시간이 소요되는 경우에만 하위 수준 기능 (objc_msgSendv)으로 이동하십시오. 그렇지 않으면 objc_msgSendv가 더 빠르더라도 관찰하기가 쉽지 않은 코드를 유지하기가 어렵습니다.

관련 문제