检查C风格函数是否存在"MyMethodName()"类型?

Kel*_*ler 7 c ios

此问题适用于iOS版本兼容性.

我知道如果函数存在,如果它是使用respondsToSelector的典型Objective-C样式方法,则该函数是否存在.即对于如下方法:

- (void) someMethod:(NSInteger)someParameter;
Run Code Online (Sandbox Code Playgroud)

您可以使用:

if ([self respondsToSelector:@selector(someMethod:someParameter)]) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

但是C风格的功能呢?如何检查是否存在如下函数:

void CStyleFunctionName(FoundationTypeRef parameter);
Run Code Online (Sandbox Code Playgroud)

谢谢!

Fab*_*ser 10

Xcode(至少从4.3开始)支持弱链接,你可以执行以下操作来查看是否可以调用C函数:

// UIGraphicsBeginImageContextWithOptions() was introduced in iOS 4 in order to support the Retina displays.
if (UIGraphicsBeginImageContextWithOptions != NULL) {
    UIGraphicsBeginImageContextWithOptions(...);
}
else {
    UIGraphicsBeginImageContext();
}
Run Code Online (Sandbox Code Playgroud)


小智 6

动态加载:

#include <dlfcn.h>

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

另请注意,在C中,没有方法,只有函数.

  • 哇,你为什么生气?我的答案更简单,建议在Apple的文档中使用.它可能不像你的一般,但在这种情况下它是适当的方式.如果编译器可以为你做这个工作,你为什么要调用`dlsym()`? (2认同)