调配函数 - 并且函数仅在运行时已知

Swizzling of a function - and function known at runtime only

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

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

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

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

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