[英]“Active SDK”,“Base SDK” and “Deployment Target” confusion
[英]How to check if not available methods are used if deployment target < base sdk?
我想知道當部署目標不如基礎SDK時,如何檢查代碼是否不調用不可用的方法?
可以在SDK等於部署目標的設備上運行應用程序,但我搜索的方式更“自動”。 任何的想法 ?
問候,昆汀
最簡單的方法是使用__IPHONE_OS_VERSION_MAX_ALLOWED預處理器定義。
你這樣做是通過添加
__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_2
或類似於目標的Build Settings中的“Preprocessor Macros”選項。 您可以在<Availability.h>中查找可用的版本。
不幸的是,如果你添加這個定義,它將導致你的預編譯頭不匹配錯誤。 因此,要解決此問題,您還需要在構建設置中關閉“預編譯前綴標題”選項。
執行此操作后,您將針對目標SDK上不存在的類獲得一堆錯誤(例如,iOS 4.2中不存在NSOrderedSet)。 如果你試圖回到iOS 4之前的版本,你可能會遇到編譯器失敗的錯誤 - 我不知道有什么辦法可以解決這個問題。 在任何情況下,忽略UIKit頭中缺少類的錯誤,並轉到錯誤列表的底部; 每次使用__IPHONE_OS_VERSION_MAX_ALLOWED指向的SDK中未包含的方法或類時,都應該找到錯誤。 確保每個方法都包含在一個
if( [targetObject respondsToSelector:@selector(thePossiblyMissingSelector:)]
你應該安全 還應測試可能缺少的類
if ([NSOrderedSet class] != nil)
這些設置不是你想要意外忘記翻轉的東西。 要使其成為測試的自動選項,請執行以下操作:
備注 :
使用NSClassFromString();
Class cls = NSClassFromString(@"YourClass");
if (cls == nil)
這是你要找的?
你在尋找像 - (BOOL)respondsToSelector:(SEL)aSelector這樣的東西
如果您有一個類的實例,則可以使用以下內容來查看它是否了解您要調用的方法:
if ([mipmapBrowserView respondsToSelector:@selector(setBackgroundColor:)]) {
// set the background layer since IKImageView supports it
}
這里, mipmapBrowserView
是的一個實例IKImageView
,這是首次在Mac OS X 10.5引入。 IKImageView的setBackgroundColor:
方法僅在10.6中添加,但是我需要在調用之前進行檢查。 這允許我構建10.6 SDK,並利用新功能,但仍然支持OS X 10.5。 雖然這個例子涉及OS X而不是iOS,但同樣的方法(雙關語意圖?)也適用於iOS。
請注意,當您對類進行子類化時,情況會略有不同,並且您想知道超類是否響應某個選擇器:
“你無法通過使用super關鍵字向對象發送respondsToSelector:來測試一個對象是否從其超類繼承了一個方法。這個方法仍然會測試整個對象,而不僅僅是超類的實現。因此,發送respondsToSelector:to super相當於將它發送給self。相反,你必須直接在對象的超類上調用NSObject類方法instancesRespondToSelector:“
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.