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

时间:2013-04-01 22:37:32

标签: objective-c reflection

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

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

查看Objective-C Runtime Reference,最好的赌注看起来像class_getClassMethod,但此参考中似乎没有任何与功能相关的功能。是否有其他原始C方法通过名称获取指向函数的指针?

4 个答案:

答案 0 :(得分:5)

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

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

并通过

调用方法
[[MyClass class] performSelector:NSSelectorFromString(@"doWork")];

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

  

dlsym()返回由指定的代码或数据位置的地址   以null结尾的字符        字符串符号。搜索哪些库和包取决于句柄   参数如果使用特殊句柄RTLD_DEFAULT调用dlsym(),   然后是过程中的所有机器图像        (除了那些用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

答案 1 :(得分:1)

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

SEL selector = NSSelectorFromString(@"doWork");
[worker performSelector:selector];

答案 2 :(得分:1)

您可以使用libffi执行所需操作。但是,除非你正在做一些像创建自己的脚本语言或类似的东西,你需要做很多事情。这可能是过度杀伤

答案 3 :(得分:0)

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

一个匿名函数..可以在任何@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!

喜欢它! ⌘