Objective-C 런타임 라이브러리 만보고 응답하지 않는 객체로 메시지를 보내면 런타임 시스템에서 수신자에게 메시지를 처리 할 수있는 또 다른 기회를 제공합니다. 따라서 수신기의 forward::
메서드가 구현되면 호출됩니다. 그러나 NSObject.mm을 보면 NSObject
은 forward::
을 구현하지 않는 것으로 보입니다.forwardInvocation은 어떻게 호출 되나요?
그래서, 전달 시스템이 호출 될 때 호출하는 것은 forward::
일 뿐이므로 NSObject
메서드는 forwardInvocation:
메서드가 어떻게 호출 되나요? Foundation은 objc_setForwardHandler
(runtime.h)을 사용하여 NSObject
개체로 보낸 메시지를 전달해야 할 때마다 forwardInvocation:
을 호출하는 새 처리기를 설정합니까?
약 6 년 전의 Apple 메일 링리스트 게시물 ([link here] (http://lists.apple.com/archives/objc-language/2007/Oct/msg00036.html))에 따르면 당신이 기초없이 달리면 않는 한'objc_setForwardHandler'를 사용하십시오. 내가 연결된 스레드에 도움이 될만한 정보가있을 수 있습니다. – lxt
예, 도움이되었습니다. 이제'Foundation'이'forwardInvocation'을 호출하기 위해'objc_setForwardHandler'를 호출했다고 확신합니다. 'objc_setForwardHandler (NULL, NULL)'을 호출하면, 이전에 설정된 모든 포워드 핸들러를 오버라이드 할 것이고, forwardInvocation 대신에 내 클래스의'forward ::'메소드가 호출됩니다. 따라서, 시작할 때 가장 확실하게 Foundation은'forwardInvocation'의 IMP를 인자로 전달하는 objc_setForwardHandler를 호출합니다. – LuisABOL
그렇게 생각할 것입니다. 나는 'Foundation'의'Cocotron' 오픈 소스 구현이'NSObject' 초기화 ([source here] (http://cocotron.googlecode.com/svn/trunk/Foundation/NSObject/NSObject.m))에서 이것을 수행한다는 것을 알고 있습니다. . – lxt