2010-08-11 69 views
2

我目前正在開發iPhone應用程序 - 暫時 - 需要在4.x之前的版本上支持。支持4.0/3.2之前的iOS版本以及NSClassFromString的問題

當我想要使用的東西4.x或3.2具體的,我會用檢查,如果給定類存在的通常的做法,即:

if(NSClassFromString(@"SomeClass")) { 
    // do stuff here 
} 

這主要工作,當它不除。 (根據文件僅適用於3.2或更新版本)

  • UIGestureRecognizer子

    • UIMoviePlayerViewController(如UIPanGestureRecognizer; UITapGestureRecognizer等)

    : 讓我解釋一下:

    類,比如實際上解析爲有效的類,就好像它們早已在早期版本的私有API上可用一樣。 是這種情況,還是我錯過了什麼?

    這真的很糟糕,因爲NSClassFromString()方法實際上是由Apple推薦的。

    爲了安全起見,我目前正在檢查操作系統版本,而不是對存在的類進行運行時檢查。

    其他人有這個問題嗎? 謝謝。

  • 回答

    0

    檢查操作系統版本甚至比使用NSClassFromString(...)更好,因爲某些類已經存在於4.0/3.2之前的版本中(如您所述)。你可以用這種方法:)

    2

    不,你沒有做錯什麼,有一些私人類在3.2/4.0中公開。如果他們只是公開現有的功能,這將不是什麼大問題,但是這些類通常也具有顯着改變的功能。

    要做的唯一100%可行的事情就是測試版本,儘管這通常是不被接受的。即使對特定的選擇器進行測試也可能不夠充分,因爲不能保證舊版本的選擇器與公佈該對象的版本上的選擇器的行爲相同。

    +0

    實際上,在有私人實施的情況下,Apple建議您檢查操作系統版本以確定功能。在處理重新呈現UIScrollView中的縮放視圖時,檢查版本也是必要的,因爲它報告OS 3.2中更改的縮放因子的方式。 – 2010-08-11 19:19:07

    +0

    請參閱WWDC第130會議視頻 - 「未來打樣您的應用程序」瞭解更多信息。 – 2010-08-11 19:21:21

    0

    對於MPMoviePlayerViewController,我使用[MPMoviePlayerController instancesRespondToSelector:@selector(view)]。它們是在同一時間添加的,並且是同一框架的一部分。

    有時Apple會記錄這個;例如對於UINib我認爲你應該檢查[UINib respondsToSelector:@selector(nibWithNibName:bundle:)]。我不記得我在哪裏讀到這個。

    我實際上沒有遇到使用NSClassFromString()的建議。我通常使用類似[AVCaptureSession class]的東西,但您同樣可以使用[[[AVCaptureSession alloc] init...] autorelease]。加載時不存在的弱鏈接符號變爲NULL;這意味着AVCaptureSession類對象變爲零,並且nil上的方法不做任何事情並返回nil。

    如果您要比較版本號,比較可靠的方法是與kCFCoreFoundationVersionNumber進行比較。我還沒有看到一個4.0; kCFCoreFoundationVersionNumber_iPhoneOS_3_2看起來是4.0頭文件中最高的一個。