У меня есть настроенный класс, который в идеале будет читать методы любого переданного класса, а затем отображать их все на один селектор во время выполнения, прежде чем перенаправлять их на свой оригинальный селектор.
Это работает прямо сейчас, но я могу сделать это только для одного метода за раз. Похоже, проблема заключается в том, что после того, как я перехитрил первый метод, мой IMP для перехвата и пересылки метода теперь поменялся местами с другими методами IMP. Любые дальнейшие попытки облажаться, потому что они используют недавно замененный IMP для замены других.
1) Итак, у меня есть MethodA, MethodB и CustomCatchAllMethod.
2) Я обмениваю MethodA с CustomCatchAllMEthod. MethodA-> CustomCatchAllMethod, CustomCatchAllMethod-> MethodA
3) Теперь я пытаюсь перейти к MethodB с помощью CustomCatchAllMethod, но поскольку CustomCatchAllMethod теперь = 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:));