【问题标题】:Best way to conditionally link frameworks based on their availability in Xcode using Objective-C使用 Objective-C 根据框架在 Xcode 中的可用性有条件地链接框架的最佳方法
【发布时间】:2012-12-11 04:15:44
【问题描述】:

我正在开发一个基于 Cocoa touch 的 Objective-c 框架,并且正在研究其他用于解析 JSON 和 XML 数据的框架。

我希望开发人员能够轻松地使用我的框架开箱即用,并且想知道有条件地包含第三方框架的最佳方式是什么。我想在信用到期时给予信用,所以我不想将其他项目包含在发行版中,但我希望开发人员能够添加一个框架(甚至只是一堆类),如 SBJson 或触摸 XML 并让我的代码库查看包含的代码库并将其与它提供的附加功能一起使用。通过某种配置文件或在项目设置中启用框架也是一种选择,但不太理想。

  1. 使用编译器设置执行此操作的最佳方法是什么?我有 看到很多开发人员从 “必需”到“可选”,但我不认为 SBJson 或 Touch XML 被编译成或使用objective-c 实现 框架包 (.framework) 或 C 静态库 (.a),因此 将无法利用这一点。

  2. 如何在代码中有条件地实现这一点?例如 SBJson 的标头是通过#import "SBJson.h" 编译器导入的 指令,但如果找不到所需的标头,这将失败。

【问题讨论】:

  • “最简单”的方法是检查标头包含保护(您知道,当您制作 c 标头时,Xcode 将包含整个 #define HAS_MYHEADER_DECL 内容),并基于此进行一些条件编译。当然,这根本不可靠。

标签: objective-c ios frameworks


【解决方案1】:

您可以包含 .h,但是当使用其中的对象时,您需要使用 NSClassFromString 调用它

【讨论】:

  • 这将是一个好方法,但如果找不到 .h 文件,LLVM/Xcode 不会抛出错误。
  • 哇!没关系。我明白你在说什么。使用 NSClassFromString 可以使用 alloc 和 init 初始化类,并且头文件检查不会引发错误,指出不包含该类。换句话说,使用 NSClassFromString() 完全绕过了编译时导入指令。有点像使用带有 id 的消息传递实例并向其发送消息。魔法!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多