使用c ++方法中的函数指针调用目标c方法

时间:2013-05-14 18:36:23

标签: c++ objective-c function-pointers

我有一个c ++类需要使用指向该方法的指针来调用目标c方法。此方法返回void并接受类型为“status”的参数,其中status是一个简单的整数枚举。

 enum status
 {
       status_valid = 0,
       status_invalid,
       status_unknown
 };

我有像这样设置的obj-c方法的指针。指向该方法的指针也被传递给c ++类和

typedef void (*FuncPtr) (status);
FuncPtr myObjCSelectorPointer = (void (*)(status))[self methodForSelector:@selector(statusChanged: )];
cppClassInstance->setFuncPointer(myObjCSelectorPointer)

mybbCSelectorPointer由cppClass保留,如下所示:

void cppClass::setFuncPointer(FunctPtr *ptr)
{
     this->funcPtr = ptr;
}

现在在其他地方,当我尝试调用此指针指向的方法时,如下所示:

status s;
funcPtr(s);

正确调用该方法,但传递给方法的值将丢失。 obj-c方法接收完全随机的值。当我尝试使用相同的方式在cpp类中调用方法时,它传递并接收正确的值。

我做错了什么?你能不能像这样调用客观的c方法吗?

1 个答案:

答案 0 :(得分:6)

问题是Objective-C方法的函数签名并不像你想象的那么简单。

为了使面向对象的编程成为可能,Objective-C方法采用两个隐式参数:id self, SEL _cmd,调用对象和发送的选择器 - 这些都需要传递。您需要获取一个对象来调用该方法,您也应该存储选择器。然后,将您的函数类型定义更改为正确的:

typedef void (*FuncPtr) (id, SEL, status);

要阅读:[1][2](在typedef id (*IMP)(id, SEL, ...)部分附近)