2016-05-05 5 views
0

Я хочу, чтобы swizzle функцию в объективе-c. Проблема в том, что - я знаю функцию, которая должна быть проверена только во время выполнения. Теперь разные методы в коде будут иметь разные типы возвращаемых данных, входные параметры и т. Д.Swizzling функции - и функция, известная только во время выполнения

Как написать (общий) код, который, если ему присвоено имя функции и класса, к которому она принадлежит, я могу создать блок а затем используйте imp_implementationWithBlock для создания IMP, а затем swizzle оригинальный метод с этим вновь созданным IMP.

ответ

1

Вы можете использовать NSSelectorFromString() для динамического поиска имени селектора, а затем выполнить swizzling. Есть много помощников, поэтому мне не нужно повторять точную логику swizzling. Например. если вы используете Aspects код может выглядеть следующим образом:

[_singleTapGesture aspect_hookSelector:NSSelectorFromString(@"setState:") withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) { 
    NSLog(@"%@: %@", aspectInfo.instance, aspectInfo.arguments); 
} error:NULL]; 

Для выполнения-swizzling вы должны убедиться, что вы знаете, что вы делаете и не корректно, если селектор не существует.

+0

позволяет сказать, что у меня есть функция foo, которая бросает исключение. Я хочу окружить тело этой функции блоком try-catch. Таким образом, мне нужно сделать блок из этой функции foo, и блок должен иметь точно такую ​​же подпись. Этот блок будет иметь попытку, между которой я буду называть исходный метод. После чего я буду пересказывать исходный код в новый блок. Таким образом, любые дальнейшие вызовы foo будут проходить через попытку, реализованную в блоке. Я не могу создать блок во время выполнения, потому что я не знаю о его аргументах и ​​возвращаемом типе во время компиляции. – prabodhprakash

+0

Аспекты предоставляются только до, после и вместо этого - мне нужно окружить его с помощью try-catch, есть ли способ сделать это с помощью Аспектов? – prabodhprakash

+0

Также, как этот блок в примере примет аргументы функции? мы должны предоставить это в useBlock. – prabodhprakash