【问题标题】:check if C-style function exists of type 'MyMethodName()'?检查是否存在“MyMethodName()”类型的 C 样式函数?
【发布时间】:2012-09-21 02:13:31
【问题描述】:

这个问题是针对iOS版本兼容性的。

如果一个函数是使用respondsToSelector 的典型Objective-C 风格方法,我知道如何检查它是否存在。即对于这样的方法:

- (void) someMethod:(NSInteger)someParameter;

你可以使用:

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

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

void CStyleFunctionName(FoundationTypeRef parameter);

谢谢!

【问题讨论】:

  • 这不是方法,而是函数。 How to Check if the function exists in C/C++ 的可能重复项另请参阅:Can I redefine a function or check if it exists?
  • 您可以通过if (CStyleMethodName != NULL) { ... } 来查看符号是否已定义。例如,如果您想与旧版本的 iOS 兼容,这就是您想要做的。
  • @FabianKreiser 仅在支持弱链接时才有效。
  • 我知道,但它适用于最新版本的 Xcode,@Keller 最近询问了有关 iOS 6 的更多问题,我认为他目前正在更新应用程序并希望使其向后兼容。 ;)
  • 那么,您没有阅读the docs,是吗?

标签: ios c


【解决方案1】:

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

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

【讨论】:

  • 知道为什么我仍然在这一行收到错误吗? if (ABAddressBookRequestAccessWithCompletion != NULL) 使用未声明的标识符“ABAddressBookRequestAccessWithCompletion”
  • 是的,框架已正确链接,我什至尝试将其设为弱(可选)库,但无济于事......顺便说一下,我正在为 iOS5 SDK 编译。 iOS6从来没有问题
  • 但是你导入了标题吗? #import <AddressBook/AddressBook.h>
  • 我发现这是由在构建设置中添加的额外框架路径引起的。我在 xcode 中同时使用 iOS5 和 iOS6 SDK,我认为编译器在 iOS5 上看起来,这就是我遇到问题的原因。 (不过我不太确定……)现在可以正常使用了!
  • 你在构建设置中哪里看到的,@schystz?我想我可能遇到了同样的问题。谢谢!
【解决方案2】:

动态加载:

#include <dlfcn.h>

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

还要注意,在 C 中,没有方法,只有函数。

【讨论】:

  • 这也很棒。但由于我的问题是针对 iOS 的,所以 Fabian 的解决方案更合适。谢谢。
  • @Keller 为什么 Fabian 的解决方案更合适?为什么我的回答不适用于 iOS?
  • 它确实有效。澄清一下,Fabian 的解决方案稍微干净一些,不需要#include。
  • @Keller 除了 1. 它需要支持弱链接,2. 它确实需要包含:NULL 在 &lt;stddef.h&gt; 中定义。
  • 哇,你为什么生气?我的回答更简单,在 Apple 的文档中被推荐。它可能不像你的那样通用,但在这种情况下它是适当的方法。如果编译器可以为您完成这项工作,您为什么要调用 dlsym()?
猜你喜欢
  • 2016-12-26
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2012-02-07
  • 2011-08-25
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多