2012-01-13 91 views
2

我在從C++文件調用Objective-C類方法時遇到了一些麻煩。例如:從C++調用Objective-C類方法

在我的.h:

@interface MyClass : NSObject { 
} 
+ (void)myMethod:(NSString *)str; 

在我的.m:

+ (void) myMethod:(NSString *)str { ... } 

在我的.cpp:

?? 

你怎麼能叫myMethod的,因爲有沒有類實例?它基本上是一個靜態?

感謝

+0

[調用從C++方法Objective-C的方法?]的可能的複製(https://stackoverflow.com/questions/1061005/calling-objective-c-method-from-c-method) – 2017-10-14 17:46:22

回答

7

C++中的對象與Objective-C中的對象不兼容。你不能簡單地從C++調用Objective-C方法。

有一些解決方案,但是:

  1. 使用的Objective-C++。重命名.cpp.mm,那麼你就可以在你的C++代碼中使用Objective-C的語法:[FlurryAnalytics myMethod: @"foo"];

  2. 使用Objective-C的運行時系統直接調用。我不會告訴你如何去做,因爲我真的認爲你不應該這樣做,事實上你不想這樣做。

  3. 寫一個純C接口。也就是說,在某些.m文件中,定義void myFunction(const char *str) { ... }並從C++中調用該文件。

+0

我認爲在C++端生成一些全局數據並用objective-c訪問它將成爲最切實可行的選項。 – Asheh 2012-01-13 14:19:34

2

你會需要一個.mm調用一個Objective-C的方法,而不是一個.cpp。除此之外,您的評論說,「它本質上是靜態的」是準確的,你會說它是用類似的邏輯的方式,你會調用靜態類函數在C++:

[MyClass myMethod:@"Some String"]; 

雖然方法不是靜態C++感覺出於一大堆不影響這個答案的原因 - 它在編譯時並沒有解決,它在類中運行(MyClass元類)。

+0

如果我沒有選擇將所有.cpp文件轉換爲.mm,我有什麼選擇?我試圖保持跨平臺的能力,所以我不能去改變文件類型。 – Asheh 2012-01-13 14:16:36

+0

.cpp文件可以調用任何包含C++和Objective-C的舊C++和.mm文件,因此薄平臺特定層是一種選擇;或者在Xcode中使用工具欄上的單詞「視圖」上方的按鈕打開右側面板,轉到「標識和類型」並將文件類型設置爲Objective-C++。這應該導致相關標誌被髮送到編譯器,以便不遵循type-by-filename的默認行爲。 – Tommy 2012-01-13 14:40:33

+0

@Asheh:你可以覆蓋Xcode中的文件類型。單擊項目導航器中的.cpp文件,文件檢查器將顯示一個名爲「文件類型」的下拉列表。將它從Default改爲Objective-C++源代碼,然後你的cpp文件可以包含Objective C語法,就好像它是一個.mm – JeremyP 2012-01-13 15:39:40