hex*_*mal 6 frameworks objective-c weak-linking ios
我正在构建我自己的框架,建议将其分发给其他开发人员以包括他们的项目.该框架可选地链接某些框架(例如CoreLocation).问题是,当我将我的框架链接到在Build Phases中不包含CoreLocation的真实独立项目时,我在尝试构建此主机项目时遇到链接器错误,如"未定义的架构符号"
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_CLLocationManager", referenced from:
objc-class-ref in MySDK(MyServerConnection.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
是否有可能避免这种情况,因为我不想强迫开发人员将CoreLocation包含在他们的项目中?实际上,我知道这是可能的,但我该怎么做呢?
que*_*ish 11
从您的问题描述中,我假设您已经知道如何通过将Xcode设置为"可选" 来使Xcode与框架进行弱连接.
您有两个问题需要解决:类可用性和符号可用性.Apple在框架编程指南:框架和弱链接以及SDK兼容性指南:使用基于SDK的开发中介绍了这一点
这非常简单:用于NSClassFromString()查看该类是否在当前环境中可用.
if (NSClassFromString("CLLocationManager") != NULL){
Run Code Online (Sandbox Code Playgroud)
如果该类可用,则可以实例化并发送消息,否则不能.
您特别感兴趣的是使用来自弱链接框架的常量或结构.C风格的功能类似,但使用CoreLocation时不需要考虑这些功能.我们将使用CoreLocation常量作为示例.
每次使用它时,必须检查以确保它存在:
if (&kCLErrorDomain != NULL){
// Use the constant
}
Run Code Online (Sandbox Code Playgroud)
请注意,&采用常量的地址进行比较.另请注意,您不能这样做:
if (kCLErrorDomain){
// Use the constant
}
Run Code Online (Sandbox Code Playgroud)
或这个:
if (&kCLErrorDomain){
// Use the constant
}
Run Code Online (Sandbox Code Playgroud)
也可以使用dlsym在运行时查找常量符号.以这种方式使用否定运算符将不起作用.您必须根据NULL地址检查常量的地址.
我已经提供了一个非常简单的应用程序示例,该应用程序正在使用静态库,该库与GitHub上的Core Location相关联. 示例应用程序未链接到Core Location:

但依赖性确实是一个可选的(弱)框架:

| 归档时间: |
|
| 查看次数: |
3058 次 |
| 最近记录: |