在低版本iOS系統(tǒng)中調(diào)用高版本API

調(diào)用高版本API會有什么問題?

在iOS7上鲤嫡,調(diào)用iOS8新加入的方法會導(dǎo)致崩潰送挑。

- (BOOL) findString:(NSString *)s inString:(NSString *)destString {
    NSString * lowDest = destString.lowercaseString;
    return [lowDest containsString:s];
}

NSStringcontainsString方法是在iOS8才被加入的,只要在iOS7上調(diào)用了containsString方法就會直接崩潰:

在iOS7上初始化iOS8才有的對象會返回nil暖眼。雖然不會崩潰惕耕,但是可能會導(dǎo)致預(yù)料外的行為。

LAContext* context = [[LAContext alloc] init];
self.touchIDEnabled =
    [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                         error:&error];

LAContext是一個iOS8才加入的對象诫肠。在iOS7上司澎,[[LAContext alloc] init]會返回nil。
調(diào)用contextcanEvaluatePolicy:error:方法栋豫,依然返回nil挤安。self.touchIDEnabled就被設(shè)置成了NO。
按照代碼邏輯丧鸯,在iOS7上self.touchIDEnabled恰好就應(yīng)該被設(shè)置為NO蛤铜,在這個例子中不會有更嚴(yán)重的問題發(fā)生,但如果這個變量是self.touchIDDisabled丛肢,事情就不好說了围肥。

一定要用低版本系統(tǒng)不支持的API的時候該怎么辦?

iOS系統(tǒng)更新會帶來新的接口和特性,我們總是會遇到不得不用新版本API的情況蜂怎,所以代碼中必須兼容新舊兩種系統(tǒng):

  • 通過判斷iOS系統(tǒng)版本來兼容
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
    // Do something
}
  • 在調(diào)用API前檢查respondsToSelector
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
    [cell setPreservesSuperviewLayoutMargins:NO];
}

  • 在創(chuàng)建對象時判斷[ClassName class]是否為nil
- (BOOL)alertControllerAvailable {
    return [UIAlertController class] != nil; // iOS 8 and later.
}

從代碼的可維護(hù)性來考慮穆刻,比較推薦后兩種方式近范。

檢查API可用性的工具

比較好的方案是用MJGAvailability.h在編譯期檢查巧鸭。
把MJGAvailability.h文件加入工程中,在預(yù)編譯頭文件最開頭加上下面的代碼即可:

#define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_7_0
#import "MJGAvailability.h"

其中的__IPHONE_7_0定義在Availability.h文件中荆陆,可以改成需要的任何系統(tǒng)版本篮愉。
配置完成后腐芍,調(diào)用不可用的API會出現(xiàn)如下形式的警告:

xxxxxxx.m:64:18: 'containsString:' is deprecated: TOO NEW!

如果配置后編譯沒有生效,把Build Settings里面的Enable Modules (C and Objective-C)項改為NO試試试躏,具體原因我還不知道是為什么猪勇。

這個工具無法檢查出我們的代碼有沒有進(jìn)行過版本兼容處理,它會對所有有問題的代碼報錯颠蕴。所以我們要在處理過兼容性的地方泣刹,顯式的用宏把代碼包起來:

MJG_START_IGNORE_TOO_NEW
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
MJG_END_IGNORE_TOO_NEW

另外有一個叫做Faux Pas的代碼靜態(tài)分析工具,可以進(jìn)行API可用性的檢查犀被,但因為它的試用版隨機(jī)隱藏了檢查結(jié)果椅您,所以就沒再研究了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寡键,一起剝皮案震驚了整個濱河市掀泳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖员舵,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脑沿,死亡現(xiàn)場離奇詭異,居然都是意外死亡马僻,警方通過查閱死者的電腦和手機(jī)庄拇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來韭邓,“玉大人措近,你說我怎么就攤上這事∪猿樱” “怎么了熄诡?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诗力。 經(jīng)常有香客問我,道長我抠,這世上最難降的妖魔是什么苇本? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮菜拓,結(jié)果婚禮上瓣窄,老公的妹妹穿的比我還像新娘。我一直安慰自己纳鼎,他們只是感情好俺夕,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贱鄙,像睡著了一般劝贸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逗宁,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天映九,我揣著相機(jī)與錄音,去河邊找鬼瞎颗。 笑死件甥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哼拔。 我是一名探鬼主播引有,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼倦逐!你這毒婦竟也來了譬正?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎导帝,沒想到半個月后守谓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡您单,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年斋荞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虐秦。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡平酿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悦陋,到底是詐尸還是另有隱情蜈彼,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布俺驶,位于F島的核電站幸逆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏暮现。R本人自食惡果不足惜还绘,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栖袋。 院中可真熱鬧拍顷,春花似錦、人聲如沸塘幅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽电媳。三九已至踏揣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匆背,已是汗流浹背呼伸。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留钝尸,地道東北人括享。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像珍促,于是被迫代替她去往敵國和親铃辖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容