假設我正在開發使用iOS 6 SDK的應用程序。我有我的部署目標設置到iOS 5 然後我可以使用的功能,從6,但爲了保持與5的兼容性,你必須在你的代碼進行一些檢查:
// method only available from 6, class of someObj existed in 5
if (someObj respondToSelector:@selector(aMethod)) {
[someObj aMethod];
}
或者
// entire class only available from 6
if (NSStringFromClass([SKStoreProductViewController class]) != nil) {
SKStoreProductViewController *store = [[SKStoreProductViewController alloc] init];
}
到目前爲止這麼好。就我所知,這是做事的標準方式。但我今天發現,對於新的類的例子,如果我只是嘗試並沒有任何檢查地從該類中分配/初始化一個對象 ,它不會在iOS 5上崩潰,而我會預期它會返回而不是返回空值。
// run this on an iOS 5 device
NSLog(@"%@", [UICollectionView alloc] init]);
爲什麼這不會導致iOS 5崩潰?我想這與 連接器的工作方式有關,但是我會期望崩潰,因爲該版本中不存在該符號。
第二個問題是:如果正常測試是使用NSStringFromClass方法,這意味着您可以將+類方法發送到一個不存在的類,它將返回null - 爲什麼/如何工作?
最後,我注意到我可以創建一個ViewController,它採用一個只在iOS 6中定義的協議,並且它不會導致5的問題。
我仍然有興趣爲與協議的情況雖然 - NS_CLASS_AVAILABLE似乎並不適用於那裏。 – Brynjar