【问题标题】:Modifying a function pointer passed to a method?修改传递给方法的函数指针?
【发布时间】:2016-02-03 13:13:40
【问题描述】:

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

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

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

然后我可以在 doSomethingWithFunctionPointer 中调用该函数,只需调用:

if (functionPointer)
{
    functionPointer();
}

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

我知道这可能是在 Objective C 中如何不做事的一个典型例子(特别是考虑到我们有块和没有的东西)。在这一点上更多的是好奇。听起来我几乎需要一个函数指针指针,但我不确定它是如何工作的,如果可能的话。

【问题讨论】:

  • 如果我理解你的情况,你说的是函数指针类型的变量。你总是可以改变指针指向的值,对吧?

标签: objective-c c pointers


【解决方案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 技巧和指向块的指针。

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 2017-07-25
    • 1970-01-01
    • 2010-12-21
    • 2022-01-04
    相关资源
    最近更新 更多