gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:58:21 24 4
gpt4 key购买 nike

我不想使用 NSNotification,因为它在内部太困惑了。是否有一种方法可以将 C++ 中的回调函数传递给 Objective-C++,然后让 Objective-C 调用它?

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

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

最佳答案

对于您要在此处涵盖的确切用例,您并非 100% 具体,但我将列出发生这种情况的场景,然后向您展示如何解决它。我希望这也能解决您的问题。

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

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

您现在有一个 C++ 类 MyCPPClass,在 MyCPPClass.hpp 中声明,您希望将 memberFunction 作为回调参数传递给MyClass 上的otherMethod:

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

首先,我们需要弄清楚MyClass 上的方法签名。 Objective-C 中回调的现代方式是使用 block 。 block 在 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();
}];
}

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

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

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

为了完整起见,另一种方法是使用 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)很好地配合使用,则要棘手得多。

关于c++ - 如何将回调函数从 C++ 传递到 Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51680267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com