预处理器指令在编译时进行评估。
在预处理器第一次运行之后
#define itunesFileSharingEnabled [[[NSBundle mainBundle] \
objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]
#if itunesFileSharingEnabled
#define something
#endif
变成
#if [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]
#define something
#endif
在第二次运行期间,预处理尝试验证[[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]
. 这不起作用,因为这无法在编译时进行评估。这是一个只能在运行时评估的语句。
我不知道你想做的事情是否有可能。(我对预处理器了解不多)。
我想你已经知道你可以在运行时进行这些检查
if ([[[NSBundle mainBundle] \
objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]) {
[self foo];
}
else {
[self bar];
}
另一种选择是强制执行手动输入的预编译器宏
这会进入您的代码,在某个地方它只被调用一次。可能在您的库的 init 中:
#if HAS_ITUNES_FILESHARING
if (![[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]) {
[NSException raise:@"MBFileSharingNotActiveButDeclaredException" format:@"File sharing is not active but \"HAS_ITUNES_FILESHARING\" is set to 1"];
}
#else
if ([[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]) {
[NSException raise:@"MBFileSharingActiveButNotDeclaredException" format:@"File sharing is active but you did not declare it as preprocessor macro. Please set \"HAS_ITUNES_FILESHARING\" to 1"];
}
#endif
这必须在Build Settings
as中输入Preprocessor Macro
:
HAS_ITUNES_FILESHARING=1
如果HAS_ITUNES_FILESHARING=1
未在预处理器宏部分中声明,但文件共享处于活动状态,则代码将引发异常。
如果HAS_ITUNES_FILESHARING=1
已声明,但文件共享未激活,代码也会引发异常。
这样,您始终可以判断预处理器宏与配置匹配。如果您只调用一次(+(void)initialize
应该完全没有性能影响。