我希望能够:
(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进行交互。
寻找一个简单的例子。我正在尝试使用委托模式或可能阻止。
答案 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
视为同一个东西,但其他东西可能会被误认为是不同的类型,然后导致链接错误。