2016-02-03 3 views
2

Есть ли способ передать указатель на метод 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; 
} 

Demo.

Примечание: Вы имеете право на блоки в Objective-C, что значительно сокращает необходимость прямого использования указателей на функции. Однако вы можете использовать аналогичный трюк typedef с указателями на блоки.

Смежные вопросы