如何将回调函数从C ++传递给Objective-C

弗兰克·乔

我不想使用NSNotification,因为它在内部太混乱了。是否可以将回调函数从C ++传递到Objective-C ++,然后让Objective-C调用它?

问题是我不知道如何将用C ++编写的函数传递给Objective-C ++,以及如何在Objective-C ++中使用该回调?是指针吗?

我知道我可以将它们混合在一起,但是我的类必须是C ++类,因为它继承了一些C ++类。

pmdj

对于要在此处介绍的确切用例,您并不是100%特定的,但是我将提出一种发生这种情况的方案,然后向您展示如何解决。我希望这也能解决您的问题。

因此,我假设您有一个Objective-C类MyClass,其接口在MyClass.h中声明

@interface MyClass : NSObject
- (void)someMethod;
- (void)otherMethodWhichShouldTakeACallback:?????;
@end

现在,您有了一个MyCPPClassMyCPPClass.hpp中声明的C ++类您希望将其memberFunction作为回调参数传递给otherMethodon MyClass

class MyCPPClass : public MyBase
{
    void memberFunction();
};

首先,我们需要找出上的方法签名MyClass在Objective-C中进行回调的现代方法是使用Blocks。块与Objective-C ++配合得很好,所以让我们一起去做,并MyClass.h用以下代码行进行修改

- (void)otherMethodWithBlock:(void(^)(void))callbackBlock;

调用代码将需要驻留在Objective-C ++编译单元(caller.mm)中:

void callOtherMemberWithCPP(MyCPPClass* cpp_obj, MyClass* objc_obj)
{
    [objc_obj otherMethodWithBlock:^{
            cpp_obj->memberFunction();
        }];
}

请注意,这不涉及对象生存期。如果您使用来管理C ++方面的生命周期std::shared_ptr,则也可以在Objective-C ++代码中使用它,在这种情况下,我们可能会得到如下结果:

void callOtherMemberWithCPP(std::shared_ptr<MyCPPClass> cpp_obj, MyClass* objc_obj)
{
    [objc_obj otherMethodWithBlock:^{
            cpp_obj->memberFunction();
        }];
}

在这种情况下,只有在使用Objective-C类完成该块时,C ++对象的引用计数才会减少。

为了完整起见,另一种方法是使用C函数指针语法。在这种情况下,您需要沿以下几行声明Objective-C方法:

- (void)otherMethodWithCallback:(void(*)(void*))callback object:(void*)opaqueCallbackArgument;

C ++类的方法调用将需要包装在一个自由函数或静态成员函数中:

void memberFunctionCallback(void* opaque_object)
{
    MyCPPClass* object = static_cast<MyCPPClass*>(opaque_object);
    object->memberFunction
}

…然后像这样调用Objective-C方法:

    [objc_obj otherMethodWithCallback:memberFunctionCallback object:cpp_obj];

但是,使此版本与自动生命周期机制很好地配合使用会shared_ptr更加棘手。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 C++/CLI 中将回调函数传递给线程

如何将回调传递给 EM_ASM for C++?

如何将带有回调的Objective-C传递给Swift方法?

如何将回调函数传递给子组件?

如何将回调函数传递给父级

如何将回调函数传递给返回多行的aggregate()?

如何将Objective-C NSError指针传递给Swift函数?

如何将C ++类函数作为回调传递

将Swift协议传递给Objective-C指针

将变量传递给Objective-C中的CLLocationManager

在Swift中将字典对象传递给Objective C协议

如何将std :: function从Objective-C ++传递给C ++方法

如何将回调函数从Java传递到Kotlin类

使用Context.actorOf时如何将回调函数传递给akka actor构造函数?

iOS-如何将数组作为参数传递给AFNetworking(Objective-C)

如何将Swift结构作为参数传递给Objective-C方法

如何将Swift类传递给需要类的Objective-C方法?

如何将带有“&”的字典参数传递给 Swift 中的 Objective-C 方法

如何将回调作为参数传递给另一个函数

如何使用nsarray将数据收集传递给Objective C代码中的javascript函数

如何将函数指针传递给成员函数C ++?

Scala-如何将回调传递给方法

如何将回调传递给孩子而不触发它

如何正确地将回调从C#传递到C?

有没有办法将函数从objective-c++传递给标准c++?

将函数中定义的变量传递给NSTimer函数Objective-c

如何将对象传递给C ++中的函数?

如何将模板化的矢量传递给C ++函数?

如何将字符数组传递给C中的函数