2009-08-10 3 views
1

전적으로 위임자가 아니더라도 기존 델리 케이트의 유일한 CERTAIN 기능을 재정의 할 수 있습니까? 기존 공유 위임의 오버라이드/스위 즐링 방법

내가 작동하지 않았다, 내와 대상 IMP를 교체 시도 '(

더 자세히!


+[SomeClass sharedDelegate] 

-[sharedDelegate targetMethodToBeOverridden:Arg:] //OUR method needs to be called, not this 

Method *targetMethod; // targetMethodToBeOverridden identified by class_copymethodlist magic 

targetMethod->method_imp = [self methodForSelector:@selector(overriddenDelegateMethod:Arg:)]; 
내 메서드가 호출되지 않는 작동하지

:(

+0

나는 당신이 질문하는 방법을 알아 냈습니다. 배지를 획득하고 돌아가서 TAOCP 질문에 대한 "무응답"을 삭제하지 않으시겠습니까? – tvanfosson

+0

나는 편집하고, 제목을 바꾸고, 질문의 태그를 다시 붙였다. 제목을 짧게 유지하고 질문에서 설명하는 것이 가장 좋습니다. 또한 ** [OBJ-C] **를 제목 접두어로 사용하는 대신 태그를 분류하도록하십시오. –

답변

3

아마도 Method 구조체를 직접 조작해서는 안되며, 런타임 함수를 대신 사용하십시오. 런타임 헤더를 #import해야하지만 거기에는 method_setImplementation이라는 멋진 메소드가 있습니다. class_getInstanceMethod이 채택 된 프로토콜에 의해 정의 된 방법에 대한 방법을 반환하지 않을 수도 있기 때문에,

id targetObject = [SomeClass sharedDelegate]; 
Method methodToModify = class_getInstanceMethod([targetObject class], @selector(replaceMe:argument:)); 
IMP newImplementation = [self methodForSelector:@selector(overriddenDelegateMethod:Arg:)]; 
method_setImplementation(methodToModify, newImplementation); 

이 특정 사건에 대한 작동하지 않을 수 있습니다,하지만이 스위 즐링 (swizzle)하기 위해 "적절한"방법이다 : 그것은이 같은 일을합니다 방법 IMPs.

+0

EXC_BAD_ACCESS GDB 오류 : '{ – RealHIFIDude

+0

} 내가 말했듯이 이것은 귀하의 구체적인 경우에는 효과가 없을 수 있습니다. 어떻게 당신의 Method 구조체를 얻고 있습니까? –