函数的混合 - 以及仅在运行时已知的函数

时间:2016-05-05 05:23:51

标签: ios objective-c method-swizzling libffi

我想在objective-c中调用一个函数。问题是 - 我知道只有在运行时需要调整的函数。现在代码中的不同方法将有不同的返回类型,输入参数等。

如何编写(通用)代码,如果给定它所属的函数和类的名称,我可以创建一个块,然后使用imp_implementationWithBlock创建IMP,然后使用这个新创建的IMP混合原始方法

1 个答案:

答案 0 :(得分:1)

您可以使用NSSelectorFromString()动态查找选择器名称,然后执行调配。有许多助手,所以我不需要重复精确的调配逻辑。例如。如果您使用Aspects,代码可能如下所示:

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

对于运行时调整,你应该确保你知道你正在做什么,如果选择器不存在,你应该优雅地失败。