【问题标题】:Delegate - Objective-C callback from C++ [closed]委托 - 来自 C++ 的 Objective-C 回调 [关闭]
【发布时间】:2015-10-07 01:22:58
【问题描述】:

我希望能够:

(1) 从 Objective-C 初始化一个 C++ 类
(2) 从 Objective-C 调用 C++ 函数
(3) 让 C++ 类调用 Objective-C 中的函数(回调/委托模式)

(1)(2) 已经使用this link 实现。但是,我无法实现 (3)

我正在为 iOS 创建一个 Objective-C 库,该库还封装并利用了 C++ 库。我可以从 Objective-C 端调用 C++ 函数;但是,我正在尝试使用从 C++ 端到 Objective-C++ 的委托模式进行回调。这里的想法是不要将 C++ 库中的代码推送到 Objective-C++ 中,而是将它们分开,以便对原始代码进行最小限度的更改。也就是说,我已经搭建了从 Objective-C -> Objective-C++ -> C++ 的桥梁,但是还没有实现从 C++ -> Objective-C++ 的回调,我可以轻松地与 Objective-C 交互。

寻找一个简单的例子。我正在尝试使用委托模式或可能会阻塞。

【问题讨论】:

    标签: c++ ios objective-c delegates objective-c++


    【解决方案1】:

    您需要使用 Objective-C++。因此,ObjC 和 C++ 之间的所有接口都需要在 .mm 文件中,而不是常规的 .m 或 .cpp 文件中。但是,您可以将内容保留在标头之外,使其可用于纯 C++/ObjC 调用者。

    要回调一个 ObjC 方法(ObjC 中没有函数,它只有 C 函数),您也需要使用 ObjC++,这与从 ObjC 调用 C++ 的方式相反:

    FooShouldCallObjCFromCpp.h

    class FooShouldCallObjCFromCpp
    {
    public:
        void CallObjC();
    
    protected:
        struct NSString* mObjCString;  // ObjC classes look just like forward-declared C structs.
    };
    

    FooShouldCallObjCFromCpp.mm

    #import <Foundation/Foundation.h>
    
    void FooShouldCallObjCFromCpp::CallObjC()
    {
        [mObjCString appendString: @" foo"];
    }
    

    您还必须从 .mm 文件中分配 mObjCString ivar 的初始值。您还可以使用 #if OBJC 和 #if __cplusplus 从头文件中删除 C++ 文件或包含它们的 ObjC 文件不能看到的代码,但要小心,因为 C++ 在以下情况下反应非常糟糕一个方法或 ivar 丢失,你会得到奇怪的内存损坏。还要小心重新定义类型。 struct NSString*@class NSString 被当前的 C++ 编译器视为相同的东西,但其他东西可能会被误认为是不同的类型,然后导致链接错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-16
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      相关资源
      最近更新 更多