【问题标题】:Objective-C Check if Structs is definedObjective-C 检查结构是否被定义
【发布时间】:2014-04-13 10:46:22
【问题描述】:

我的 iOS 应用程序可以使用可选的外部 3rd 方库。

我想过使用这个答案 (Weak Linking - check if a class exists and use that class) 并在执行特定于该库的代码之前检测该类是否存在。

但是,我发现这个外部库不是写成 Objective-C 类,而是写成 C STRUTS 和函数。

是否有类似的技术可以让我检查 C Strut 或函数是否存在?或者一些更好的替代方法来查看这个库在运行时是否存在?

【问题讨论】:

  • 什么是外部第三方库?他们可能有一些#defines 可以用来检查。
  • 我不能说这个库是什么,但你是对的,他们的公共头文件使用#define,所以我会试试
  • 现在查看我的相关问题,因为我提供了更多详细信息:stackoverflow.com/questions/23103121/…

标签: objective-c c struct weak-linking


【解决方案1】:

structs 是编译时工件。它们告诉编译器如何布局内存区域。一旦完成,structs 就变得不必要了。与具有元数据的 Objective-C 类不同,structs 没有运行时存在。这就是为什么无法在运行时检测到它们的原因。

您可以通过调用dlopen 并传递其路径来检查是否存在动态库:

void *hdl = dlopen(path_to_dl, RTLD_LAZY | RTLD_LOCAL);
if (hdl == NULL) {
    // The library failed to load
    char *err = dlerror(); // Get the error message
} else {
    dlclose(hdl);
}

如果dlopen 返回NULL,则无法加载库。您可以致电dlerror 获取更多信息。完成后您需要致电dlclose

【讨论】:

    【解决方案2】:

    AFAIK 必须存在一个经典的 C 函数。它在链接过程中是静态绑定的,它不像 Objective-C 方法那样在运行时动态绑定。

    所以当代码编译和链接没有错误或警告时,你应该没问题。

    结构也一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2015-06-02
      • 2011-10-09
      • 2014-12-28
      • 2020-12-18
      • 2013-09-05
      • 1970-01-01
      相关资源
      最近更新 更多