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

Calling an objective c method using a function pointer from a c++ method

本文关键字:方法 调用 objective 指针 c++ 使用 函数      更新时间:2023-10-16

我有一个c++类,需要使用指向该方法的指针调用一个objective 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)

myObjCSelectorPointer由cppClass持有,如下所示:

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

在其他地方,当我尝试调用这个指针指向的方法时,像这样:

status s;
funcPtr(s);

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

我做错了什么?你能不这样调用objective - c方法吗?

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

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

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

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