전달 된 모든 클래스의 메서드를 읽고 이상적인 방법으로 런타임에 단일 선택기로 매핑하여 원래의 선택기로 전달하는 클래스를 설정했습니다.여러 메서드 swizzles에 대한 메서드 IMP 복사
이것은 현재 작동하지만 한 번에 하나의 방법으로 만 수행 할 수 있습니다. 문제는 첫 번째 방법을 뒤집어 쓰면 내 IMP가 그 방법을 포착하고 전달하는 것이 이제 다른 방법 IMP와 바뀌 었다는 것입니다. 다른 플레이어를 대체하기 위해 새로 교환 된 IMP를 사용하기 때문에이 모든 시도는 실패합니다.
1) 그래서 MethodA, MethodB 및 CustomCatchAllMethod가 있습니다.
2) MethodA를 CustomCatchAllMEthod와 교체합니다. MethodA -> CustomCatchAllMethod, CustomCatchAllMethod -> MethodA
3) 이제 CustomCatchAllMethod를 사용하여 MethodB로 바꾸려고 시도하지만 CustomCatchAllMethod now = MethodA이므로 MethodB는 MethodA와 MethodA-> MethodB가됩니다.
그럼 내가 가로 채기를 원하는 각 새 선택기에 대해 내 IMP의 새 인스턴스를 가져 오거나 복사하려면 어떻게합니까? 다른 하나와 하나의 방법을 차단하고자 할 때 일반적인 방법 - 스위 즐링 패턴에만 작동
void swizzle(Class classImCopying, SEL orig){
SEL new = @selector(catchAll:);
Method origMethod = class_getInstanceMethod(classImCopying, orig);
Method newMethod = class_getInstanceMethod(catchAllClass,new);
method_exchangeImplementations(origMethod, newMethod);
}
//In some method elsewhere
//I want this to make both methodA and methodB point to catchAll:
swizzle(someClass, @selector(methodA:));
swizzle(someClass, @selector(methodB:));
고마워요! 나는 내가 그걸 해결할 수 있는지 알아볼거야. 나는 이미 호출을 전달하고 IMPS를 저장하기에 너무 정교한 시스템을 가지고있어서 너무 큰 문제는 없어야한다. –
그건 정말 트릭을 했어, 너무 간단, 내가 그것을 놓친 걸 믿을 수 없어. 다시 한 번 감사드립니다! –