2012-09-20 26 views
6

Esta pregunta está orientada a la compatibilidad de la versión de iOS.comprobar si existe la función C-style de tipo 'MyMethodName()'?

Sé cómo comprobar si existe una función si se trata de un método de estilo Objective-C típico que utiliza respondsToSelector. es decir, para un procedimiento tal como:

- (void) someMethod:(NSInteger)someParameter; 

Se puede utilizar:

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

Pero ¿qué pasa con funciones de tipo C? ¿Cómo puedo comprobar si existe una función que se parece a:

void CStyleFunctionName(FoundationTypeRef parameter); 

¡Gracias!

+1

Eso no es un método, que es una función. Posible duplicado de [Cómo verificar si la función existe en C/C++] (http://stackoverflow.com/questions/8814705/how-to-check-if-the-function-exists-in-cc) Ver también: [¿Puedo redefinir una función o verificar si existe?] (Http://stackoverflow.com/questions/6916772/can-i-re-define-a-function-or-check-if-it-exists) –

+1

Usted puede hacer 'if (CStyleMethodName! = NULL) {...}' para ver si el símbolo está definido. Eso es lo que quieres hacer si quieres ser compatible con versiones anteriores de iOS, por ejemplo. –

+1

@FabianKreiser que solo funciona si se admite enlaces débiles. –

Respuesta

10

Xcode (al menos desde el 4.3) permite el acoplamiento débil y se puede hacer lo siguiente para ver si se puede llamar una función C:

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

alguna idea ¿por qué todavía obtengo un error en esta línea? si (ABAddressBookRequestAccessWithCompletion! = NULL) El uso de identificador no declarado 'ABAddressBookRequestAccessWithCompletion' – schystz

+0

Asegúrese de importar el marco de libreta de direcciones –

+0

Sí, el marco está correctamente vinculado e incluso he intentado por lo que es débil (opcional) lib pero fue en vano .. Estaba compilando para iOS5 SDK por cierto.Nunca tuve problemas con iOS6 – schystz

6

dinámico de carga:

#include <dlfcn.h> 

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

También tenga en cuenta que en C, no existen métodos, sólo funciona.

+0

Esto también es genial. Pero como mi pregunta estaba orientada hacia iOS, la solución de Fabian es más apropiada. Gracias. – Keller

+0

@Keller ¿por qué es la solución de Fabian más apropiada? ¿Por qué mi respuesta no es buena para iOS? –

+0

Funciona. Para aclarar, la solución de Fabian es ligeramente más limpia y no requiere un #include. – Keller