2010-01-06 40 views
1

如果我將iPhone應用程序的Base + Active SDK設置爲3.0並將部署目標設置爲2.2,我可以使用2.2版本的新版本函數設備?使用iPhone OS 3.0函數調用代替2.2設備上不推薦使用的2.2函數調用

例如,UITableViewCell現在需要使用[cell.imageView setImage:image]來設置圖像,而在2.2中,您可以撥打[cell setImage:image]。 2.2設備上會不會使用新的[cell.imageView setImage:image]崩潰?

回答

3

不,你不能在我們的OS 3.0調用2.2。至少在操作系統3中,棄用的方法應該是正常的。在許多情況下,在操作系統中棄用,只是表示蘋果推薦使用新方法而不推薦使用新方法;但這些方法也可能在未來消失。

您有幾種選擇:

  1. 根本無視警告,只要應用程序和方法上的OS 3.0的實際工作。
  2. 有一個運行時檢查,以確定操作系統版本,並調用適當的方法:

    double version = [[[UIDevice currentDevice] systemVersion] doubleValue]; 
    if (version >= 3.0) { 
        [cell.imageView setImage:image]; 
    } else { 
        [cell setImage:image]; 
    } 
    

    或更好:

    if ([cell respondsToSelector:@selector(imageView)]) { 
        [cell.imageView setImage:image]; 
    } else { 
        [cell setImage:image]; 
    } 
    

    注意,編譯時檢查,使用ifdef指令贏得」 t工作

  3. 刪除OS 2.2支持。由於3.X的吸收率相當高,因此您僅以3.0爲目標是相當合理的。在我的小應用程序中,在12月份,我有2,058位用戶使用3.0系統之前的27位用戶。不用說,這個選項可以顯着減少您的測試需求。

+1

不夠公平 - 我希望在部署目標被適當設置時,系統會在編譯時挑選新的函數調用。我個人更喜歡使用'if([cellrespondsToSelector:@selector(imageView)])'作爲我的運行時檢查,但我確定這是一個偏好問題;) – Ted 2010-01-06 13:06:08

+0

我加了你的建議。 respondsToSelector肯定比操作系統檢查我的意見更好,只是忘了它! Objective-C是一種動態語言,因此在編譯時方法不會得到解決。 – notnoop 2010-01-06 13:11:33

+0

不錯的。我仍然好奇,但是會[''cell.imageView setImage:image]'剛剛在運行時崩潰了2.2?不幸的是,我沒有2.2設備進行測試。 – Ted 2010-01-06 13:18:49

1

不,您不能在2.x設備上使用OS 3.0調用。如果你甚至可以在2.x設備上安裝一個基於3.0的應用程序,我會很驚訝。

+1

嗨, 我認爲你誤解了 - 部署目標設置爲2.2(根據Apple最佳實踐)。 – Ted 2010-01-06 12:39:47

+0

這裏有幾件事情:BASE SDK,部署目標和ACTIVE SDK。您可以將BASE SDK設置爲任何您想要的,但是,只有在ACTIVE SDK設置爲3.0或更高版本之前,針對(例如)3.0 SDK的API調用將不可用(即不會編譯)。部署目標將允許您在2.x目標上安裝3.0-active-SDK,但不會運行。 – 2010-01-06 12:55:11

+0

所以我會在2.2上調用'[cell.imageView setImage:image]'時在運行時崩潰? – Ted 2010-01-06 12:58:06

相關問題