簡體   English   中英

如果部署目標<base sdk,如何檢查是否使用了可用的方法?

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

這些設置不是你想要意外忘記翻轉的東西。 要使其成為測試的自動選項,請執行以下操作:

  1. 創建一個名為“Old SDK Testing”的新構建配置。
  2. 僅為此配置定義__IPHONE_OS_VERSION_MAX_ALLOWED和預編譯頭選項(點擊構建設置中每行旁邊的顯示箭頭以訪問每個配置設置)。
  3. 復制當前的Scheme並將其名稱設置為“Old SDK Check”。
  4. 將此新方案中的“運行”項的“生成配置”設置為您在步驟1中創建的生成配置。
  5. 選擇新的Scheme和build。

備注

  • 我不保證這會抓住您的任何/所有問題。
  • UIKit以外的任何東西都不會被這張支票抓住。
  • 這不能替代您計划支持的iOS版本上的代碼測試

使用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:“

  1. 我找到的最好的方法:用舊的SDK編譯代碼:) 鏈接,這可以幫助

  2. 我認為這個問題與下一步有關

  3. 我相信有一天Apple允許通過簡單定義#define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_3_0來編譯舊SDK的項目#define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_3_0

  4. upd:我在這里找到了解決方案

4.3 5.0和5.1 SDK嘗試重新定義此宏后無法編譯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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