2012-09-20 94 views
6

此問題適用於iOS版本兼容性。檢查是否存在類型爲'MyMethodName()'的C風格函數?

我知道如何檢查一個函數是否存在,如果它是一個典型的使用respondsToSelector的Objective-C風格的方法。即對於諸如方法:

- (void) someMethod:(NSInteger)someParameter; 

您可以使用:

if ([self respondsToSelector:@selector(someMethod:someParameter)]) { 
    //do something 
} 
關於C風格的函數

可是什麼?如何檢查是否函數存在,看起來像:

void CStyleFunctionName(FoundationTypeRef parameter); 

謝謝!

+1

這不是一個方法,它是一個函數。可能的[如何檢查函數是否存在於C/C++]的副本(http://stackoverflow.com/questions/8814705/how-to-check-if-the-function-exists-in-cc)另請參閱: [我可以重新定義一個函數或檢查它是否存在?](http://stackoverflow.com/questions/6916772/can-i-re-define-a-function-or-check-if-it-exists) –

+1

你可以做'if(CStyleMethodName!= NULL){...}'來查看符號是否被定義。例如,如果您想要與舊版iOS兼容,那就是您想要做的。 –

+1

@FabianKreiser僅在弱連接支持時纔有效。 – 2012-09-20 17:35:39

回答

10

Xcode的(至少從4.3)支持弱鏈接,你可以做以下的,看看你可以調用C函數:

// UIGraphicsBeginImageContextWithOptions() was introduced in iOS 4 in order to support the Retina displays. 
if (UIGraphicsBeginImageContextWithOptions != NULL) { 
    UIGraphicsBeginImageContextWithOptions(...); 
} 
else { 
    UIGraphicsBeginImageContext(); 
} 
+0

任何想法爲什麼我仍然在這一行上得到一個錯誤? 如果(ABAddressBookRequestAccessWithCompletion!= NULL) 使用未聲明的標識符的「ABAddressBookRequestAccessWithCompletion」 – schystz

+0

確保導入通訊錄框架 –

+0

呀,框架鏈接正確,我甚至試圖使它弱(可選)LIB,但無濟於事..我正在編譯iOS5 SDK。從來沒有與iOS6 – schystz

6

動態加載:

#include <dlfcn.h> 

void *fptr = dlsym(NULL, "CStyleFunctionName"); 
if (fptr != NULL) { 
    // existent 
} else { 
    // nonexistent 
} 

還要注意的是,在C,有沒有方法,唯一的功能。

+0

這也很棒。但是因爲我的問題是面向iOS的,所以Fabian的解決方案更合適。謝謝。 – Keller

+0

@凱勒爲什麼費邊的解決方案更合適?爲什麼我的答案對iOS不好? – 2012-09-20 17:44:20

+0

它確實有效。澄清一下,Fabian的解決方案只是稍微清潔一點,不需要#include。 – Keller