修改传递给方法的函数指针?

时间:2016-02-03 13:13:41

标签: objective-c c pointers

有没有办法将函数指针传递给Objective C方法,然后让该方法修改函数指针以指向其他地方的C函数?

创建一个接受函数指针的方法很简单:

- (void)doSomethingWithFunctionPointer:(void(*)(/* args go here */))functionPointer;

然后我可以通过调用:

在doSomethingWithFunctionPointer中调用该函数
if (functionPointer)
{
    functionPointer();
}

但是如果我真的想将functionPointer更改为指向doSomethingWithFunctionPointer中的其他内容,那么该方法之外的任何代码都可以调用更改的函数指针来调用doSomethingWithFunctionPointer将其指向的函数?

我知道这可能是如何不在Objective C中做事的一个主要例子(特别是考虑到我们有块而不是什么)。在这一点上,更多的只是好奇心。它几乎听起来像我需要一个函数指针指针,但我不确定它是如何工作的,如果它甚至可能。

1 个答案:

答案 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;
}

Demo.

注意:你对Objective-C中的块是正确的,大大减少了直接使用函数指针的需要。但是,您可以使用类似的typedef技巧和指向块的指针。