gpt4 book ai didi

objective-c - 通过用户输入的名称调用函数

转载 作者:搜寻专家 更新时间:2023-10-30 19:58:47 25 4
gpt4 key购买 nike

是否可以在 Objective C 中按名称调用函数?例如,如果我知道一个函数的名称(“foo”),有什么方法可以获取指向使用该名称的函数的指针并调用它?我偶然发现了 python 的类似问题 here似乎在那里是可能的。我想将函数的名称作为用户输入并调用该函数。此函数不需要任何参数。

最佳答案

对于 Objective-C 方法,您可以使用 performSelector...NSInvocation,例如

NSString *methodName = @"doSomething";
[someObj performSelector:NSSelectorFromString(methodName)];

对于动态库中的C函数,可以使用dlsym(),例如

void *dlhandle = dlopen("libsomething.dylib", RTLD_LOCAL);
void (*function)(void) = dlsym(dlhandle, "doSomething");
if (function) {
function();
}

对于静态链接的 C 函数,不是一般的。如果相应的符号还没有从二进制文件中剥离出来,你可以使用dlsym(),例如

void (*function)(void) = dlsym(RTLD_SELF, "doSomething");
if (function) {
function();
}

更新:ThomasW 写了一条评论指向a related question, with an answer by dreamlax反过来,它包含指向 the POSIX page about dlsym 的链接.在那个答案中,dreamlax 注意到以下关于将 dlsym() 返回的值转换为函数指针变量的内容:

The C standard does not actually define behaviour for converting to and from function pointers. Explanations vary as to why; the most common being that not all architectures implement function pointers as simple pointers to data. On some architectures, functions may reside in an entirely different segment of memory that is unaddressable using a pointer to void.

考虑到这一点,上面对 dlsym() 的调用和所需的函数可以更便携,如下所示:

void (*function)(void);
*(void **)(&function) = dlsym(dlhandle, "doSomething");
if (function) {
(*function)();
}

关于objective-c - 通过用户输入的名称调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4954361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com