必需要知道的Deprecated APIs處理方式

必需要知道的Deprecated APIs處理方式

每當Apple有新的API取代原先的API時就會提醒開發者這項API已經要廢棄(Deprecated),這時如果您所選擇的系統版本可能需要做一些相容性的做法讓程式使用的API能在新、舊版本執行順利。

物件是否能使用

新、舊版本交替時非常有可能會將整個物件不再被新版本支援,所以可以先判斷物件是否存在:

//-----------start-----------
if ([UIPrintInteractionController class]) {
    // 物件能使用,在此建立
} else {
    // 物件已經不存在
}
//------------end------------

或是使用此方式:

//-----------start-----------
Class cls = NSClassFromString (@"NSRegularExpression");
if (cls) {
    // 物件能使用,在此建立
} else {
    // 物件已經不存在
}
//------------end------------

物件方法是否能使用

當新版本物件仍然能使用,但它的方法卻有可能改良、改名稱來繼續使用時,就需要先確定該物件方法是否存在:

//-----------start-----------
if ([UIImagePickerController instancesRespondToSelector:@selector (availableCaptureModesForCameraDevice:)]) {
    // 物件方法能使用,在此執行方法
} else {
    // 物件方法已經不存在,在此做對應的解決方式
}
//------------end------------

//-----------start-----------
if ([someObject respondsToSelector:@selector(base64EncodedDataWithOptions:)])
{
  // 物件方法能使用,在此執行方法
  base64String = [someObject base64EncodedDataWithOptions:0];
}
else
{
  // 物件方法已經不存在,在此做對應的解決方式
  base64String = [someObject base64Encoding];
}
//------------end------------

也能先在程式中加入預先處理器的方式讓編譯時效率更好:

//-----------start-----------
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0

//檢查物件的方法是否存在
if ([someObject respondsToSelector:@selector(base64EncodedDataWithOptions:)])
{
  // 物件方法能使用,在此執行方法
  base64String = [someObject base64EncodedDataWithOptions:0];
}
else

#endif

{
  // 物件方法已經不存在,在此做對應的解決方式
  base64String = [someObject base64Encoding];
}
//------------end------------

參考資料

SDK Compatibility Guide

Everything You Need to Know about iOS and OS X Deprecated APIs