使用c++方法中的函数指针调用objective c方法
Calling an objective c method using a function pointer from a c++ method
我有一个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, ...)
一部分)
相关文章:
- 如何强制从重写方法调用重写的方法基方法?
- C++:使用方法调用析构函数的顺序是什么?
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 指向类方法调用的指针
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 是否有可以处理方法调用依赖关系的设计模式?
- 如何缩短C++中的方法调用?
- 从部分专用模板方法调用模板非静态方法
- 有没有办法禁止派生类中的基类方法调用?
- 为什么这C++只在编译器上编码一个不明确的方法调用Microsoft?
- 从父方法调用子方法
- 如何将子方法调用到父方法
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 从静态方法调用静态函数指针
- 从同一类中的另一个方法调用方法时出错
- 方法调用意外地像 l 值一样起作用
- 无法从派生的一个方法调用基类方法
- 从类方法调用命名空间中名为 Same 的函数时,重载解析失败
- C 多线程JAVA JNI方法调用