4

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

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

查看Objective-C 运行时参考,最好的选择看起来像class_getClassMethod,但在这个参考中似乎没有任何与函数相关的函数。还有其他原始 C 方法可以通过名称获取指向函数的指针吗?

4

4 回答 4

5

如果你想调用一些静态的 objc 方法,你可以把它作为一个类的类方法

@interface MyClas : NSObject
+ (int)doWork;
@end

并通过调用该方法

[[MyClass class] performSelector:NSSelectorFromString(@"doWork")];

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

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

因此您可以使用它根据符号名称查找函数指针

不知道为什么要这样做,有时使用函数表可以做到

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
于 2013-04-01T23:11:23.990 回答
1

如果您知道方法签名,您可以使用NSSelectorFromString函数为其创建选择器,例如:

SEL selector = NSSelectorFromString(@"doWork");
[worker performSelector:selector];
于 2013-04-01T22:41:49.690 回答
1

你可以用libffi做你想做的事。但除非你正在做一些事情,比如创建自己的脚本语言或类似的事情,否则你需要做很多这类事情。很可能是矫枉过正

于 2013-04-01T23:08:38.373 回答
0

我想知道同样的事情..我想,在研究了一下之后..没有“标准C”方法来做这样的事情..(喘气)..但是救援?目标 C 块!

一个匿名函数..可以是 OUTSIDE any@implementation等...

 void doCFunction() { printf("You called me by Name!"); } 

然后,在你的 Objective-C 方法中......你可以以某种方式“获取”名称,并“调用”函数......

NSDictionary *functionDict = @{ @"aName" : ^{ doCFunction(); } };
NSString *theName = @"aName";

((void (^)()) functionDict[theName] )();

结果:You called me by Name!

喜欢它!⌘

于 2013-04-01T23:23:38.117 回答