我不想使用NSNotification,因为它在内部很混乱。是从C ++ 将回调函数传递给Objective-C ++并让Objective-C调用的一种方法吗?
问题是我不知道如何将用C ++编写的函数传递给Objective-C ++,以及如何在Objective-C ++中使用该回调?是指针吗?
我知道我可以将它们混合在一起,但是我的类必须是C ++类,因为它继承了一些C ++类。
答案 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];
之类的自动生存期机制很好地配合,则要棘手得多。