有没有办法将函数指针传递给Objective C方法,然后让该方法修改函数指针以指向其他地方的C函数?
创建一个接受函数指针的方法很简单:
- (void)doSomethingWithFunctionPointer:(void(*)(/* args go here */))functionPointer;
然后我可以通过调用:
在doSomethingWithFunctionPointer中调用该函数if (functionPointer)
{
functionPointer();
}
但是如果我真的想将functionPointer更改为指向doSomethingWithFunctionPointer中的其他内容,那么该方法之外的任何代码都可以调用更改的函数指针来调用doSomethingWithFunctionPointer将其指向的函数?
我知道这可能是如何不在Objective C中做事的一个主要例子(特别是考虑到我们有块而不是什么)。在这一点上,更多的只是好奇心。它几乎听起来像我需要一个函数指针指针,但我不确定它是如何工作的,如果它甚至可能。
答案 0 :(得分:1)
这可以使用指向函数指针的指针来完成。也许最可读的方法是typedef
你的函数指针,如下所示:
typedef void (*FunPtr)(int a, float b);
然后使用typedef
- ed类型的指针在函数中赋值,如下所示:
void foo(int a, float b) {
printf("FOO : %d %f\n", a, b);
}
void bar(int a, float b) {
printf("BAR : %d %f\n", a, b);
}
// This function receives a pointer to function pointer
void assign(int n, FunPtr *ptr) {
if (n == 0) {
*ptr = foo;
} else {
*ptr = bar;
}
}
以下是您从代码中调用assign
的方式:
int main(void) {
FunPtr f;
assign(0, &f);
f(10, 20.5);
assign(1, &f);
f(10, 20.5);
return 0;
}
注意:你对Objective-C中的块是正确的,大大减少了直接使用函数指针的需要。但是,您可以使用类似的typedef
技巧和指向块的指针。