1

더 쉬운 테스트 (스터 빙 등)를위한 몇 가지 Objective-C 런타임 메서드에 대한 래퍼 클래스를 만들고 싶습니다. Objective-C 메소드에서 C 함수로의 가변 인수. 은 "..."목적-C 방법에 대한 연산자,하지만 어떻게 내가 할 수Objective-C 메서드에서 C 함수로 가변 인수 목록을 전달하는 방법

id objc_msgSend(id theReceiver, SEL theSelector, ...) 

은 내가 사용할 수 있습니다 이해 :

예를 들어, 나는 다음과 같은 기능 서명으로 C 함수를 래핑 할 이것을 C 함수에 전달 하시겠습니까?

- (id)msgSend:(id)theReceiver selector:(SEL)theSelector, ... 
{ 
    return objc_msgSend(theReceiver, theSelector, ...) // <-- how to pass variable arguments? 
} 
+0

복제본은 메소드가 가변 인수 목록을 전달하는 방법에 대해 묻지 만 해답도이 질문에 적용됩니다. – rmaddy

+0

이 질문은 다른 질문과 "유사"하지만, 나는 그것이 "중복"이라는 것에 동의하지 않습니다. – 5StringRyan

답변

2

수 없습니다. 가변 인수는 전달할 수 없습니다. 당신이 할 수있는 가장 가까운 것은 가변 인수 대신에 va_list을 취하는 함수의 변이를 찾은 다음 va_list을 초기화하고 함수에 넘깁니다.

예전에는 objc_msgSend()objc_msgSendv()과 같은 보조 기능이있었습니다. 그 이후로 사용되지 않으며 제거되었습니다. 하지만 그 기능을, 당신이 할 수 있습니다 :

- (id)sendMessageTo:(id)selfish selector:(SEL)sel, ... 
{ 
    va_list args; 
    va_start(args, sel); 
    id retVal = objc_msgSendv(selfish, sel, args); 
    va_end args; 
    return retVal; 
} 
+0

Bummer,이 함수는 지난 달 정도 부딪쳤다는 점에서 사용되지 않는 두 번째 유용한 함수가 될 것입니다. – 5StringRyan

+0

@ 5StringRyan 네, 너무 좋지 않아요. ( –

+1

처음에는 variadic으로 선언 된 메소드에서만 작동하므로 매우 유용하지 않습니다. 전달 메커니즘. – bbum

1

당신은 순수 C으로이 작업을 수행 할 수 없습니다. 그러나이 목적을 위해 언어 브리징을 위해 Apple에서 사용하고있는 (또는 사용 된) libffi도 존재합니다. AOP 프레임 워크에서 사용했습니다. 그것은 아주 잘 작동합니다.

관련 문제