如果方法只能在某些iOS版本上使用,我通常会使用respondsToSelector:
检查其可用性。
使用const CGFloat
声明,这是不可能的。
我尝试使用的特定常量是UIFontWeightBlack
,其定义为:
UIKIT_EXTERN const CGFloat UIFontWeightBlack NS_AVAILABLE_IOS(8_2);
检查我的代码运行的iOS版本是否支持此常量的最佳方法是什么?
另外,如果我想支持使用旧版iOS SDK构建我的框架,那么在编译时检查的最佳方法是,使用的SDK是否提供此符号?
我目前会用
进行检查#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_2
有没有办法直接检查符号,而不必依赖/明确指定iOS SDK版本?
答案 0 :(得分:9)
检查外部(外部)常量或通知名称的可用性,方法是将其地址(而不是符号的裸名称)显式比较为NULL或nil。
所以你的代码是:
if (&UIFontWeightBlack != NULL) {
// It is safe to use the constant
}
答案 1 :(得分:1)
要回答问题的第二部分,请将编译时间检查更改为以下内容:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80200 // 80200 is the value of __IPHONE_8_2
我们希望回退使用宏的值而不是宏本身,因为在旧版本的iOS SDK中没有定义宏。
正如您在评论中提到的,Conditionally Compiling for Different SDKs部分介绍了这一点:
以下代码摘录演示了这一点。注意使用 数值
1050
代替__MAC_10_5
中的符号#if
比较子句:如果代码加载到较旧的系统上 不包括符号定义,比较仍然有效。