2009-11-30 35 views
0

嘗試將純C/C++代碼作爲外部靜態庫集成到iPhone項目中。到目前爲止這麼好,但現在我卡在一個點,我需要寄存器庫回調。圖書館應該在發生事情時通知我的iPhone應用程序。似乎是一個定義代表的好地方。作爲iPhone委託協議的一部分的Plain C回調函數指針?

...但庫期待C函數指針回調。我如何定義那些在Objective-C,我如何將這些用作委託模式的一部分?

對不起,真的不能給示例代碼。這裏有點類似:第一個我用來註冊的接口,接下來是回調的定義。

registerCallBack(&aCBack, &bCBack, &cCBack, &dCBack, &eCBack); 

typedef void (aCBack)(uint32_t magic); 
typedef void (bCBack)(const NewData* newData); 
typedef void (cCBack)(uint32_t value, const std::vector<DataStuff*>* stuff); 
typedef void (dCBack)(uint32_t value, const SomeData* data, const std::string text, uint32_t type); 
typedef void (eCBack)(uint32_t value, const MoreData* more); 

......哦,順便說一句,其中一個問題是每個Objective-C類的方法都有兩個隱藏的參數。不知道如何處理這一點。除了更改該外部庫的接口外。

回答

4

您需要使用C++/C接口進行回調,然後在內部將調用委託給您的Objective-C代碼。在回調註冊允許您傳遞足夠大小的用戶數據的情況下,您可以方便地傳遞標識您的上下文的內容,如this answer
無法通過任何上下文的回調無論如何都必須調用Objective-C部件的類方法。

+0

讀這麼多次,每次理解多一點:)想知道如何做**「內部委託調用你的Objective-C代碼「**?看單身設計模式,很多工作。還有其他方法嗎? – JOM 2009-12-03 11:54:06

+0

如果你可以調用C++類,這個類的實現可以包含Objective-C代碼 - 所以你可以調用例如Objective-C類中,您的C++實例包含「id」或類似的。這實際上取決於所提及的能力以及周圍的環境和特定的用例:) – 2009-12-03 16:21:16

2

你必須使用普通的C函數這一點,但是當你正在編譯的Objective-C中,您可以通過只要打電話向他們的委託對象:

// need to have a reference to the object, of course 
static DelegateClass* delegate = NULL; 

// call at runtime with your actual delegate 
void setCallbackDelegate (DelegateClass* del) { delegate = del; } 

void callbackA (uint32_t magic) 
{ 
    [delegate handleCallbackA:magic]; 
} 

// and so on... 

[更新:廣發點你可以使用一個類的方法,並避免需要setCallbackDelegate。]