有没有办法从字符串中反射性地调用Objective-C中的函数?

dev*_*os1 4 reflection objective-c

是否有任何Objective-C运行时函数允许我从标识函数的字符串中获取函数(或块)指针?我需要一些方法来动态查找和调用函数或静态方法,基于识别它的某种形式的字符串.

理想情况下,此函数应该能够存在于任何动态加载的库中.

查看Objective-C运行时参考,最好的选择看起来像class_getClassMethod,但在此参考中似乎没有任何与功能相关的功能.是否有其他原始C方式获取指向函数的名称?

Bry*_*hen 5

如果要调用某个静态objc方法,可以将其作为类的类方法

@interface MyClas : NSObject
+ (int)doWork;
@end
Run Code Online (Sandbox Code Playgroud)

并通过调用方法

[[MyClass class] performSelector:NSSelectorFromString(@"doWork")];
Run Code Online (Sandbox Code Playgroud)

如果你真的想使用C风格的函数指针,你可以检查dlsym()

dlsym()返回由以null结尾的字符串符号指定的代码或数据位置的地址.搜索哪些库和包取决于handle参数如果使用特殊句柄RTLD_DEFAULT调用dlsym(),则按顺序搜索过程中的所有mach-o图像(除了那些用dlopen(xxx,RTLD_LOCAL)加载的图像)装了.这可能是一次代价高昂的搜索,应该避免.

所以你可以用它来找到基于asymbol名称的函数指针

不知道为什么要这样做,有时候使用功能表可以做到

typedef struct {
    char *name,
    void *fptr // function pointer
} FuncEntry;

FuncEntry table[] = {
    {"method", method},
    {"method2", method2},
}

// search the table and compare the name to locate function, you get the idea
Run Code Online (Sandbox Code Playgroud)