2012-09-20 12 views
6

Diese Frage bezieht sich auf Kompatibilität mit iOS-Versionen.überprüfen, ob eine C-Stil-Funktion vom Typ 'MyMethodName()' existiert?

Ich weiß, wie man überprüft, ob eine Funktion existiert, wenn es eine typische Objective-C-Stil-Methode ist, die requestsToSelector verwendet. d Für ein Verfahren wie zum Beispiel:

- (void) someMethod:(NSInteger)someParameter; 

können Sie verwenden:

if ([self respondsToSelector:@selector(someMethod:someParameter)]) { 
    //do something 
} 

Aber was ist im C-Stil-Funktionen? Wie kann ich prüfen, ob eine Funktion vorhanden ist, die wie folgt aussieht:

Vielen Dank!

+1

Das ist nicht eine Methode ist, ist es eine Funktion. Mögliches Duplikat von [Wie man überprüft, ob die Funktion in C/C++ existiert] (http://stackoverflow.com/questions/8814705/how-to-check-if-the-function-exists-in-cc) Siehe auch: [Kann ich eine Funktion neu definieren oder überprüfen, ob sie existiert?] (Http://stackoverflow.com/questions/6916772/cani-i-re-define-a-function-or-check-if-it-exists) –

+1

Sie kann 'if (CStyleMethodName! = NULL) {...}' um zu sehen, ob das Symbol definiert ist. Das möchten Sie tun, wenn Sie beispielsweise mit älteren iOS-Versionen kompatibel sein möchten. –

+1

@FabianKreiser, der nur funktioniert, wenn eine schwache Verknüpfung unterstützt wird. –

Antwort

10

Xcode (zumindest seit 4.3) unterstützt schwache Verknüpfung und Sie können die folgenden sehen Sie, wenn Sie eine C-Funktion aufrufen können:

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

eine Idee warum bekomme ich immer noch einen Fehler in dieser Zeile? if (ABAddressBookRequestAccessWithCompletion! = NULL) Verwendung von nicht deklarierter Bezeichner ‚ABAddressBookRequestAccessWithCompletion‘ – schystz

+0

Stellen Sie sicher, das Adressbuch Rahmen importieren –

+0

Ja, wird der Rahmen richtig verbunden und ich habe sogar versucht, es schwach (optional) lib, aber ohne Erfolg zu machen .. Ich habe übrigens für iOS5 SDK kompiliert.Hatte nie Probleme mit iOS6 – schystz

6

Dynamisches Laden:

#include <dlfcn.h> 

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

auch, dass in C beachten Sie, es gibt keine Methoden, nur Funktionen.

+0

Das ist auch toll. Aber da meine Frage auf iOS ausgerichtet war, ist Fabians Lösung angemessener. Vielen Dank. – Keller

+0

@Keller warum ist Fabians Lösung angemessener? Warum ist meine Antwort nicht gut für iOS? –

+0

Es funktioniert. Um es zu verdeutlichen, ist Fabians Lösung nur ein bisschen sauberer und benötigt kein #include. – Keller

Verwandte Themen