代码之家  ›  专栏  ›  技术社区  ›  Patroclus

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

  •  1
  • Patroclus  · 技术社区  · 8 年前

    我不想使用NSNotification,因为它在内部太混乱了。是不是有办法 传递回调函数 从C++到ObjuleC++,让Objto-C调用它?

    问题是,我不知道如何将C++中的函数传递给ObjuleC++,如何在ObjtoVC++中使用回调函数呢?是指针吗?

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   pmdj    8 年前

    你并不是百分之百的具体到你试图在这里涵盖的具体用例,但是我将阐述这种情况发生的场景,然后向你展示如何解决它。我希望这也能解决你的问题。

    所以我假设你有一个目标C类 MyClass 其接口声明为 我的类.h :

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

    现在你有一个C++类 MyCPPClass ,声明于 MyCPPClass.hpp公司 你想通过的 memberFunction 作为 otherMethod 类名 :

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

    首先,我们需要找出 类名 . Objective-C中回调的现代方法是使用块。块与ObjuleC++一起工作得很好,所以我们一起去修改 MyClass.h 使用以下行:

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

    调用代码需要驻留在ObjaveC++编译单元中( 呼叫者.mm ):

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

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

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

    在这种情况下,当Objy-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 不过要复杂得多。