4

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

 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)

myObjCSelectorPointer 被 cppClass 持有,如下所示:

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

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

status s;
funcPtr(s);

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

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

4

1 回答 1

6

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

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

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

待读:[1] , [2](靠近部分typedef id (*IMP)(id, SEL, ...)

于 2013-05-14T18:44:33.863 回答