[英]How to check for NS_AVAILABLE_IOS with const CGFloat
當一個方法只能在某些iOS版本上使用時,我通常使用respondsToSelector:
來檢查它的可用性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版本?
SDK兼容性指南中對此進行了介紹。
通過顯式地將其地址(而不是符號的裸名稱)與NULL或nil進行比較,檢查外部(外部)常量或通知名稱的可用性。
所以你的代碼是:
if (&UIFontWeightBlack != NULL) {
// It is safe to use the constant
}
要回答問題的第二部分,請將編譯時間檢查更改為以下內容:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80200 // 80200 is the value of __IPHONE_8_2
我們希望回退使用宏的值而不是宏本身,因為在舊版本的iOS SDK中沒有定義宏。
正如您在評論中提到的,這包含在Conditional Compiling for Different SDKs部分中:
以下代碼摘錄演示了這一點。 請注意在
#if
比較子句中使用數值1050
而不是符號__MAC_10_5
:如果代碼加載到不包含符號定義的舊系統上,則比較仍然有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.