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

时间:2018-08-03 21:27:21

标签: c++ objective-c objective-c++

我不想使用NSNotification,因为它在内部很混乱。是从C ++ 将回调函数传递给Objective-C ++并让Objective-C调用的一种方法吗?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

您现在有了一个C ++类MyCPPClass,该类在 MyCPPClass.hpp 中声明,您想在其上将memberFunction作为回调参数传递给{ otherMethod

MyClass

首先,我们需要找出class MyCPPClass : public MyBase { void memberFunction(); }; 上的方法签名。在Objective-C中进行回调的现代方法是使用Blocks。块与Objective-C ++配合得很好,因此让我们一起使用它,并用以下行修改 MyClass

MyClass.h

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

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

请注意,这并不涉及对象生存期。如果您要使用void callOtherMemberWithCPP(MyCPPClass* cpp_obj, MyClass* objc_obj) { [objc_obj otherMethodWithBlock:^{ cpp_obj->memberFunction(); }]; } 在C ++方面管理生命周期,则也可以在Objective-C ++代码中使用它,在这种情况下,我们可能会得到类似以下内容的信息:

std::shared_ptr

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

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

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

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

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

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

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

要使此版本与 [objc_obj otherMethodWithCallback:memberFunctionCallback object:cpp_obj]; 之类的自动生存期机制很好地配合,则要棘手得多。