2012-09-20 6 views
6

Questa domanda è orientata per la compatibilità della versione iOS.controllare se esiste una funzione in stile C di tipo "MyMethodName()"?

So come verificare se esiste una funzione se si tratta di un tipico metodo in stile Objective-C che utilizza respondsToSelector. vale a dire per un metodo come:

- (void) someMethod:(NSInteger)someParameter; 

È possibile utilizzare:

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

Ma per quanto riguarda le funzioni in stile C? Come posso verificare se esiste una funzione che assomiglia a:

void CStyleFunctionName(FoundationTypeRef parameter); 

Grazie!

+1

Questo non è un metodo, è una funzione. Possibile duplicato di [Come verificare se la funzione esiste in C/C++] (http://stackoverflow.com/questions/8814705/how-to-check-if-the-function-exists-in-cc) Vedi anche: [Posso ridefinire una funzione o controllare se esiste?] (Http://stackoverflow.com/questions/6916772/can-i-refine-a-function-or-eck-if-it-exists) –

+1

Tu può fare 'if (CStyleMethodName! = NULL) {...}' per vedere se il simbolo è definito. Ad esempio, è quello che vuoi fare se vuoi essere compatibile con le versioni precedenti di iOS. –

+1

@FabianKreiser che funziona solo se il collegamento debole è supportato. –

risposta

10

Xcode (almeno dal 4.3) supporta il collegamento debole, e si può fare quanto segue per vedere se si può chiamare una funzione C:

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

qualche idea perché continuo a ricevere un errore su questa linea? se (ABAddressBookRequestAccessWithCompletion! = Null) Uso di identificatore non dichiarato 'ABAddressBookRequestAccessWithCompletion' – schystz

+0

Assicurarsi di importare il quadro AddressBook –

+0

Sì, il quadro è correttamente legato e ho anche provato che lo rende debole (opzionale) lib ma senza alcun risultato .. A proposito, stavo compilando per iOS5 SDK.Mai avuto problemi con iOS6 – schystz

6

dinamico carico:

#include <dlfcn.h> 

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

noti inoltre che in C, non esistono metodi, solo funzioni.

+0

Anche questo è fantastico. Ma dato che la mia domanda era orientata verso iOS, la soluzione di Fabian è più appropriata. Grazie. – Keller

+0

@ Keller perché la soluzione di Fabian è più appropriata? Perché la mia risposta non è buona per iOS? –

+0

Funziona. Per chiarire, la soluzione di Fabian è leggermente più pulita e non richiede un #include. – Keller

Problemi correlati