4

Objective-C 런타임 라이브러리 만보고 응답하지 않는 객체로 메시지를 보내면 런타임 시스템에서 수신자에게 메시지를 처리 ​​할 수있는 또 다른 기회를 제공합니다. 따라서 수신기의 forward:: 메서드가 구현되면 호출됩니다. 그러나 NSObject.mm을 보면 NSObjectforward::을 구현하지 않는 것으로 보입니다.forwardInvocation은 어떻게 호출 되나요?

그래서, 전달 시스템이 호출 될 때 호출하는 것은 forward:: 일 뿐이므로 NSObject 메서드는 forwardInvocation: 메서드가 어떻게 호출 되나요? Foundation은 objc_setForwardHandler (runtime.h)을 사용하여 NSObject 개체로 보낸 메시지를 전달해야 할 때마다 forwardInvocation:을 호출하는 새 처리기를 설정합니까?

답변

12

어떤 시점에서 뒤로 시간이 인 경우 Objective-C 런타임에 NSObject이 없었습니다. Brad Cox와 Tom Love가 처음 만든 언어는 Object이라는 루트 객체 클래스에 추가되었습니다. 이것은 메시지 전달을 수행하는 데 사용 된 [Object forward::]을 구현했습니다.

몇 년 후 NextStep이 언어에 추가되어 OpenStep 프레임 워크 (코코아가 됨)를 만들었습니다. NextStep은 Object 클래스를 없애고 NSObject으로 바꿨습니다. 변경된 사항 중 하나는 forward:: 메서드를 forwardInvocation으로 바꾸는 것이 었습니다. Object 클래스는 여전히 소스 코드에서 시작하고 있지만, iOS 나 64 비트 OS X 앱에서는 사용할 수 없다고 확신합니다.

당신은 objc_setForwardHandlerforwardInvocation 모든 NSObjects 대신 forward::의 사용되어야한다는 것을 표시하는 데 사용됩니다 것을 제안하는 올바른. 나는 Foundation이 이것을 부르는 지 확신하지 못한다. 나는initialisation에서 추측 할 것이다. 나는 또한 기본 실행 시간 구현에 크게 의존하지는 않았지만, 적어도 일부 도움이 되었기를 바랍니다.

+0

약 6 년 전의 Apple 메일 링리스트 게시물 ([link here] (http://lists.apple.com/archives/objc-language/2007/Oct/msg00036.html))에 따르면 당신이 기초없이 달리면 않는 한'objc_setForwardHandler'를 사용하십시오. 내가 연결된 스레드에 도움이 될만한 정보가있을 수 있습니다. – lxt

+0

예, 도움이되었습니다. 이제'Foundation'이'forwardInvocation'을 호출하기 위해'objc_setForwardHandler'를 호출했다고 확신합니다. 'objc_setForwardHandler (NULL, NULL)'을 호출하면, 이전에 설정된 모든 포워드 핸들러를 오버라이드 할 것이고, forwardInvocation 대신에 내 클래스의'forward ::'메소드가 호출됩니다. 따라서, 시작할 때 가장 확실하게 Foundation은'forwardInvocation'의 IMP를 인자로 전달하는 objc_setForwardHandler를 호출합니다. – LuisABOL

+0

그렇게 생각할 것입니다. 나는 'Foundation'의'Cocotron' 오픈 소스 구현이'NSObject' 초기화 ([source here] (http://cocotron.googlecode.com/svn/trunk/Foundation/NSObject/NSObject.m))에서 이것을 수행한다는 것을 알고 있습니다. . – lxt

1

SO post은 메시지가 응답하지 않는 개체로 전송 될 때 발생하는 상황에 대해보다 자세한 답변을 제공합니다.

관련 문제