2015-10-07 105 views
0

Objective-C的回調我想能夠:
代表 - 從C++

(1)從目標C初始化一個C++類
(2)呼叫C++從目標函數-C
(3)有C++類的呼叫在Objective-C(回調/委託模式)的函數的

(1)0 (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進行交互。

尋找一個簡單的例子。我試圖使用委託模式或可能阻止。

回答

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伊娃的初值爲好。您也可以使用#if OBJC和#if __cplusplus從頭文件中刪除包含它們的C++文件或ObjC文件一定不能看到的代碼,但要小心,因爲C++在方法或ivar進行時反應非常糟糕錯過了,你會得到奇怪的內存損壞。還要小心重新定義類型。當前的C++編譯器會將struct NSString*@class NSString看作是相同的東西,但其他東西可能會被誤認爲是不同類型,然後導致鏈接錯誤。