我想在objective-c中调配一个函数。问题是 - 我知道只在运行时需要调整的函数。现在代码中的不同方法将具有不同的返回类型、输入参数等。
我应该如何编写一个(通用)代码,如果给定它所属的函数和类的名称,我可以创建一个块,然后使用 imp_implementationWithBlock 创建 IMP,然后使用这个新创建的 IMP 调整原始方法。
我想在objective-c中调配一个函数。问题是 - 我知道只在运行时需要调整的函数。现在代码中的不同方法将具有不同的返回类型、输入参数等。
我应该如何编写一个(通用)代码,如果给定它所属的函数和类的名称,我可以创建一个块,然后使用 imp_implementationWithBlock 创建 IMP,然后使用这个新创建的 IMP 调整原始方法。
您可以使用NSSelectorFromString()
动态查找选择器名称,然后执行 swizzling。有很多助手,所以我不需要重复确切的混乱逻辑。例如,如果您使用Aspects,代码可能如下所示:
[_singleTapGesture aspect_hookSelector:NSSelectorFromString(@"setState:") withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
NSLog(@"%@: %@", aspectInfo.instance, aspectInfo.arguments);
} error:NULL];
对于运行时调配,您应该确保您知道自己在做什么,并且如果选择器不存在则优雅地失败。