我目前正在开发一个具有引用Security.h框架的类的项目。由于这是一个可重用的类,并且可能在多个项目中使用,我希望添加编译时检查检查安全框架是否已添加到项目中。我在项目中添加的含义是它是否已添加到当前目标的 Link Binary With Libraries 构建阶段。
现在,我知道有类似头衔的问题被多次询问,this particular question似乎与我正在寻找的内容非常接近,但我也没有找到答案。
我一直在使用:
#ifdef __SENTINEL_VALUE_
..conditional code here..
#endif
代码,但如果框架标头声明主标头中的sentinel值,则此仅有效。让我提供两个比较和对比的例子:
SystemConfiguration.framework
有一个框架标题SystemConfiguration.h
,其中包含所有子标题,但也声明了自己的标记值,即_SYSTEMCONFIGURATION_H
因此,使用#ifdef _SYSTEMCONFIGURATION_H
进行检查非常有效。但是,对于Security.framework
,框架标头Security.h
不会声明自己的标记值。它的每个子标题都声明了自己的标记值,但由于它们是在Security.h
中导入的,因此标记值会定义。因此,即使项目中未包含Security.framework
(未在构建阶段中链接),其子标题之一的#ifndef
也会返回false值,因为sentinel值是由于其定义的在Security.h
文件中导入(更不用说这种检查框架标题的子标题的方法让我感到有些难过)。
所以,我的问题是:对于像Security.framework
这样的独特案例,检查框架是否已添加到链接二进制文件中的相应编译时间检查是什么使用库阶段(如果存在此类检查)。
此外,我知道NSClassFromString()
方法和NS_CLASS_AVAILABLE
宏,但我不是在寻找运行时解决方案。
提前致谢!
干杯!
答案 0 :(得分:2)
链接阶段在编译阶段之后,因此编译器无法判断框架是否将链接到项目。
如果您的项目的产品是框架,动态库或可执行文件,您只需将二进制文件链接到安全框架,就可以了。
如果项目的产品是静态库,则需要确认生成最终可执行二进制文件的项目是否会链接到安全框架。建议的方法是提供安装和使用文档,可能还有示例。
答案 1 :(得分:0)
这可能有点太晚了,但对于遇到此类问题的人的未来参考,试试这个
BOOL isFrameworkLoaded = (NSClassFromString(@"MyClassNameFromTheFramework") != nil);
无法获得信用,这里是原始帖子的链接