簡體   English   中英

如何使用const CGFloat檢查NS_AVAILABLE_IOS

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM