簡介:
混合C 和Objective-C 程式碼可以對於iOS 和macOS 開發中的互通性至關重要。本文探討如何從 C 成員函數中呼叫 Objective-C 方法,解決了使用跨平台應用程式時的常見問題。
來自 C 的 Objective-C 方法呼叫 :
從 C 呼叫 Objective-C 方法的關鍵在於建立 C 包裝函數。此函數為 Objective-C 方法提供了 C 風格的接口,使其可供 C 程式碼存取。
C 包裝函數:
這是一個C 代碼示例包裝函數:
int MyObjectDoSomethingWith(void *myObjectInstance, void *parameter) { // Call the Objective-C method using Objective-C syntax return [(id)myObjectInstance doSomethingWith:parameter]; }
Objective-C 類接口:
需要從C 存取的Objective-C類別應該宣告一個包含目標方法的介面:
@interface MyObject : NSObject { int someVar; } - (int)doSomethingWith:(void *)aParameter; @end
C 類別整合:
在C 類別中,您可以包含宣告C 包裝函數的標頭並使用它來呼叫Objective-C方法:int MyCPPClass::someMethod(void *objectiveCObject, void *aParameter) { // Invoke the Objective-C method using the C trampoline function return MyObjectDoSomethingWith(objectiveCObject, aParameter); }
替代方案:PIMPL實作
PIMPL(指向實現的指標)習慣可以透過封裝Objective-C 實例來提供更物件導向的方法在私有實作中類別:// MyClassImpl.h (Private Implementation) class MyClassImpl { private: void *self; }; // MyObject (Objective-C) @interface MyObject : NSObject { int someVar; } - (void)logMyMessage:(char *)aCStr; @end // MyCPPClass (C++) class MyCPPClass { private: MyClassImpl * _impl; }; void MyCPPClass::doSomething() { _impl->logMyMessage("Hello from C++!"); }
結論:
遵循這些技術,您可以有效地混合C 和Objective-C程式碼,從而實現兩種語言之間的無縫互通性您的 iOS 或 macOS 應用程式。請記住考慮您專案的特定需求並選擇最適合您要求的方法。以上是如何從 C 成員函數中呼叫 Objective-C 方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!