2010-10-01 96 views
6

我想寫一個應用程序,可以在iOS 3.1.3上運行至iOS 4.1。我知道如何設置部署目標和基礎SDK。編寫支持iOS 3.1.3和iOS 4.x的iOS應用程序時的缺陷

閱讀Apple文檔後,它很大程度上依賴於檢查類是否可用和/或實例是否響應特定選擇器。

現在我的問題:

  1. 如果蘋果從3.1.3製造類公到4.x會發生什麼?當只檢查類名時,它也可以在iOS 3.1.3上使用?所以在這個版本中,我將使用私人API,我不想要。你會如何檢查?這真的是一個問題,還是我擔心得太多?
  2. 你還會使用iOS版本定義的預處理符號嗎?
  3. 我應該選擇哪種體系結構armv6或armv7?我認爲armv6也是在armv7上運行的,對嗎?
  4. 如果我在iOS 3.1.3中沒有的代碼中使用某些東西,我可以從編譯器獲得任何幫助嗎?它會被檢查嗎?
  5. 我應該知道哪些突出的缺陷?

我已經觀看了WWDC10的會議130「面向未來的應用程序」,所以事情說已知。

謝謝。

+0

我發現,向後兼容性測試是不可能使用的模擬器。如果您將Xcode 3.2.2與3.1.3 SDK一起使用,它將只在運行此版本Xcode的模擬器上運行。在3.2.4的模擬器上,它會崩潰。 – GorillaPatch 2010-10-24 08:30:36

回答

1

根據個人經驗,也許不會有所有正確的答案,但我會嘗試:

  1. 我不認爲這是因爲背後有私有API禁令推理的問題。蘋果公司禁止私人API(至少部分),因爲他們不希望事情在未來版本的iOS中改變,因爲它現在是公共API,並且保證被支持。

  2. 沒有線索。我已經看到它們用於可以在OSX和iOS上運行的代碼。但我不認爲我會這樣做,因爲在運行時檢測到iOS版本,編譯實際上只能說明OS X與iOS,而不是3.x vs 4.x.

  3. 與armv6一起去,這樣你就可以支持老的iOS設備。這對armv7來說不會有問題。我相信你是對的,armv7可以運行爲armv6構建的應用程序,但我不確定。

  4. 這取決於您的目標部署平臺。如果您調用棄用的代碼,您會收到警告。

  5. 也許吧。我遇到了iAd的問題,但我不記得具體細節。只要檢查現有的類,並記住在必要時做弱鏈接和類實例化。

1

有一點需要注意:不能使用預處理符號,因爲這些符號在編譯時已解決。因此,如果您針對3.1.3框架編譯應用程序,即使在運行4.0(或4.1,當前)的設備上也無法使用4.0框架。我個人通過制定兩個目標來解決這個問題。

+1

據我所知,如果你想提交應用程序到應用程序商店,你必須針對最新的(非beta)框架進行編譯。所以人們可以在編譯時使用所有的預處理符號,或者我錯過了什麼? – GorillaPatch 2010-10-21 11:30:00

+0

是的,你必須根據最新的框架進行編譯;抱歉。我的意思是部署目標。您無法使用預處理符號來確定您正在運行的是哪個版本的iOS,因爲這些版本是在編譯時解決的,並且始終會解析爲部署目標。 – Don 2010-10-21 17:40:39

+1

我認爲人們必須依賴動態運行時選項,如respondsToSelector:或ClassFromString:如果該功能可用,您可以在運行時動態檢查它們。 – GorillaPatch 2010-10-23 09:00:24

1

(3)隔離:有沒有必要來挑去,只產生一個胖二進制既ARM6和ARM7代碼,這是默認行爲反正。是否使用拇指指令取決於程序在大多數時間執行的操作 - ARMv6 Thumb不包含浮點運算,因此浮點運算的成本很高。相反,如果你根本不做很多浮點數學運算,那麼離開拇指模式並節省內存帶寬和緩存大小會更聰明。 ARMv7 Thumb包含浮點操作。

在項目:檢查出的「架構」的設置。它可能是'Standard(arm6 arm7)',它會產生胖二進制。

要設置每架構Thumb模式(或任何其他設置),在目標信息窗口中選中它,然後點擊底部的小COG離開並選擇「添加構建設置條件」。然後,您可以爲SDK和體系結構的特定組合設置適用於該設置的值。因此,如果您要通過目標CPU系列進行區分,那麼您希望這樣做兩次,爲'任何SDK'添加'ARMv6'的值,併爲'任何SDK'添加'ARMv7'的值。

+0

感謝您的回答。最後,我離開了標準的架構設置。我認爲在對應用程序進行深入分析後,Thumb功能將派上用場。瞭解這些事情是很好的,但是我會依靠基準來防止被我自己的期望所迷惑。 – GorillaPatch 2011-01-05 06:58:20