我不想使用NSNotification,因为它在内部太混乱了。是否可以将回调函数从C ++传递到Objective-C ++,然后让Objective-C调用它?
问题是我不知道如何将用C ++编写的函数传递给Objective-C ++,以及如何在Objective-C ++中使用该回调?是指针吗?
我知道我可以将它们混合在一起,但是我的类必须是C ++类,因为它继承了一些C ++类。
对于要在此处介绍的确切用例,您并不是100%特定的,但是我将提出一种发生这种情况的方案,然后向您展示如何解决。我希望这也能解决您的问题。
因此,我假设您有一个Objective-C类MyClass
,其接口在MyClass.h中声明:
@interface MyClass : NSObject
- (void)someMethod;
- (void)otherMethodWhichShouldTakeACallback:?????;
@end
现在,您有了一个MyCPPClass
在MyCPPClass.hpp中声明的C ++类,您希望将其memberFunction
作为回调参数传递给otherMethod
on 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] 删除。
我来说两句