委托 - 来自C ++的Objective-C回调

时间:2015-10-07 01:22:59

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

我希望能够:

(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进行交互。

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

1 个答案:

答案 0 :(得分:2)

您需要使用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丢失时,你会得到奇怪的内存损坏。还要注意重新定义类型。当前的C ++编译器将struct NSString*@class NSString视为同一个东西,但其他东西可能会被误认为是不同的类型,然后导致链接错误。