iOS10 再談CAAnimationDelegate相關(guān)協(xié)議的適配

前言

之前寫過這樣一篇文章:

iOS10 CAAnimationDelegate的簡單適配

文中提到了在iOS10中雅倒,關(guān)于系統(tǒng)API里CAAnimationDelegate協(xié)議的一些變化以及一種較為妥協(xié)的的適配寫法捂寿。此文是基于上文的一個補充和完善,并提出一些相對更為完善的寫法吸申。
為了方便和節(jié)省大家的時間,先在此直接給出下文中提到的一種最簡單的寫法,對于探究過程沒有興趣的可以直接忽略下文(但是還是強烈建議看看孟抗,一方面這么寫一項都不能缺省是有重要原因的润匙,另一方面如果你還有其他想法诗眨,歡迎據(jù)此給出指正或建議)

#if defined(__IPHONE_10_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0)
@interface ViewController () <CALayerDelegate>
#else
@interface ViewController ()
#endif
@end

1.起因

寫這篇文章的起因是前陣子在寫一個demo時,用到了CALayerDelegate的相關(guān)協(xié)議方法孕讳,并遇到了和CAAnimationDelegate一樣的情況匠楚,警告。
查看API厂财,也看到了類似的變化:

iOS10以后的CALayerDelegate(截圖自xcode8.1相關(guān)API)

再對比下10以前的:

iOS10之前的CALayerDelegate(截圖自xcode7.3.1相關(guān)API)

同樣的變化芋簿,由基類的分類這種非正式協(xié)議,變成了正式的協(xié)議聲明璃饱。再看下這個代理的前后變化:

iOS10以后
iOS10之前

本來也是直接按照之前的方式來解決這個警告的与斤,但是細想下來,不知道這樣的變化還有多少荚恶,只是目前遇到的撩穿,都只是QuartzCore框架下的。這或許是蘋果在規(guī)范自己的API谒撼?

2.關(guān)于這里的適配

這里說的適配食寡,并不是像適配某一個方法是否兼容某一系統(tǒng)版本那樣的適配,因為那種版本適配不做的話嗤栓,影響的是APP的兼容性冻河。而這里的適配箍邮,并不會影響APP的兼容性,有試過直接用低版本真機編譯這些未經(jīng)適配的協(xié)議代碼叨叙,執(zhí)行并不會有什么影響锭弊。具體機理我并不能說太清楚,但是畢竟這只是一種針對原有API的修改擂错,而不是新增味滞。(其實我一直是很好奇像NS_AVAILABLE_IOS這類相關(guān)的宏標示的方法和其指定的低版本系統(tǒng)不兼容的原因,是系統(tǒng)執(zhí)行這些代碼時會遇到什么問題嗎钮呀?求解剑鞍。)

那么做這樣的適配意義又何在?
開發(fā)兼容爽醋。

一個團隊協(xié)作開發(fā)蚁署,可能因為各種原因,每個人的xcode版本并不能保持一致(適配iOS7及以下的機器用xcode8調(diào)試不了蚂四、低版本系統(tǒng)的mac裝不了新的xcode……)光戈。
還有就是我們在寫一些開源三方時,不做這樣的兼容適配遂赠,有些使用低版本xcode的開發(fā)者久妆,在使用你的代碼時,可能會因此報錯跷睦,從而造成一些不必要的麻煩筷弦。

3.更好的適配寫法

這里的更好,是相對之前那篇文章來的抑诸。
之前那樣寫烂琴,是因為不能確定開發(fā)者xcode版本,從而不能直接使用__IPHONE_10_0這類宏哼鬓。

3.1.嘗試的方案一

#if (__IPHONE_OS_VERSION_MAX_ALLOWED == __IPHONE_10_0) || (__IPHONE_OS_VERSION_MAX_ALLOWED == __IPHONE_10_1)
@interface ViewController () <CALayerDelegate>
#else
@interface ViewController ()
#endif
@end

既然不能確定__IPHONE_10_0宏是否存在监右,從而不能直接寫__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0這樣的判定語句(因為若__IPHONE_10_0宏不存在,這個邏輯恒成立從而無效)异希,那么改為判等應(yīng)該就沒問題了健盒,可惜因為10.1也出來了,只能增加或邏輯称簿。不過扣癣,這樣做,同樣帶來了維護的代價憨降,系統(tǒng)肯定是要持續(xù)迭代的父虑,每次迭代都要新增或條件,這樣做麻煩不說授药,風險也是遠大于之前的做法的士嚎。呜魄。。

3.2.改進的方案二

#ifdef __IPHONE_10_0
@interface ViewController () <CALayerDelegate>
#else
@interface ViewController ()
#endif
@end

既然是因為無法判斷__IPHONE_10_0宏是否存在莱衩,那么就以此為條件豈不是正好爵嗅?而且這類宏是隨版本迭代持續(xù)遞增的,那么只要__IPHONE_10_0存在笨蚁,應(yīng)該就可以確認xcode版本至少是8睹晒,畢竟__IPHONE_10_1肯定是之后出現(xiàn)的。
然而括细,經(jīng)過實際實驗……在xcode7.3.1上依舊報錯:CALayerDelegate協(xié)議不存在伪很,#ifdef條件分支依舊參與編譯了……why?奋单?锉试?
首先這樣的邏輯應(yīng)該是沒問題的,那就查看xcode7.3.1的API吧辱匿。果然键痛,在CABase.h文件中發(fā)現(xiàn)了這樣的一段定義:

xcode7.3.1中CABase.h文件中的一段定義

什么鬼炫彩?匾七??9.3.1還要涉及10.0了江兢?難怪之前的條件可以成立……
再次翻看xcode8.1中關(guān)于CABase.h中的相關(guān)部分昨忆,好嘛,這些已經(jīng)全都沒有了杉允,整個頭文件的宏定義改了一大半邑贴,基本“面目全非”了,果然是善變啊……

3.3.完善的方案三

有了之前兩次嘗試叔磷,方案三應(yīng)運而生拢驾,也就是文章開頭的那個了:

#if defined(__IPHONE_10_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0)
@interface ViewController () <CALayerDelegate>
#else
@interface ViewController ()
#endif
@end

這就是為什么開頭有提到,一項都不能缺省改基,否則后果見方案二繁疤。
這里除了判斷__IPHONE_10_0宏是否定義,還判斷了當前系統(tǒng)的版本是否是大于10.0的秕狰,其實主要是為了判斷xcode的版本是否是大于8.0的(第2部分提到的開發(fā)適配)稠腊。
#if defined(__IPHONE_10_0)這個等效于#if defined __IPHONE_10_0,也就是我們通常寫的#ifdef __IPHONE_10_0的簡化后的單條件版本鸣哀,用#if defined更為靈活架忌,可以判斷多個條件。
當然這里也可以根據(jù)習慣拆開寫我衬,即先寫#ifdef __IPHONE_10_0叹放,再寫#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0饰恕,只是多了幾步,意思相同井仰。

至此懂盐,針對這部分的適配結(jié)束了。最終的方案應(yīng)該是較為完善的了糕档,目前也沒有想到更合適的了莉恼。實際使用測試,還沒有發(fā)現(xiàn)什么問題速那,如果你遇到了俐银,歡迎及時反饋。

參考文章:
1.C語言的條件編譯#if端仰, #elif捶惜, #else, #endif荔烧、#ifdef吱七, #ifndef
2.#if、#ifdef鹤竭、#if defined之間的區(qū)別
3.#if defined和#if !defined(c語言的宏定義)

·轉(zhuǎn)載請聲明·

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踊餐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子臀稚,更是在濱河造成了極大的恐慌吝岭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吧寺,死亡現(xiàn)場離奇詭異窜管,居然都是意外死亡,警方通過查閱死者的電腦和手機稚机,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門幕帆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赖条,你說我怎么就攤上這事失乾。” “怎么了谋币?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵仗扬,是天一觀的道長。 經(jīng)常有香客問我蕾额,道長早芭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任诅蝶,我火速辦了婚禮退个,結(jié)果婚禮上募壕,老公的妹妹穿的比我還像新娘。我一直安慰自己语盈,他們只是感情好舱馅,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刀荒,像睡著了一般代嗤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缠借,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天干毅,我揣著相機與錄音,去河邊找鬼泼返。 笑死硝逢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的绅喉。 我是一名探鬼主播渠鸽,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柴罐!你這毒婦竟也來了徽缚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤丽蝎,失蹤者是張志新(化名)和其女友劉穎猎拨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屠阻,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年额各,在試婚紗的時候發(fā)現(xiàn)自己被綠了国觉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡虾啦,死狀恐怖麻诀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情傲醉,我是刑警寧澤蝇闭,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站硬毕,受9級特大地震影響呻引,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吐咳,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一逻悠、第九天 我趴在偏房一處隱蔽的房頂上張望元践。 院中可真熱鬧,春花似錦童谒、人聲如沸单旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽象浑。三九已至,卻和暖如春琅豆,著一層夾襖步出監(jiān)牢的瞬間融柬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工趋距, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粒氧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓节腐,卻偏偏與公主長得像外盯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翼雀,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 因為要結(jié)局swift3.0中引用snapKit的問題,看到一篇介紹Xcode8,swift3變化的文章,覺得很詳細...
    uniapp閱讀 4,391評論 0 12
  • 一.iPhone X尺寸問題 1. 高度增加了145pt饱苟,變成812pt. 2.屏幕圓角顯示,注意至少留10pt邊...
    騎行天下閱讀 12,777評論 5 36
  • 1.尺寸適配1.原因 iOS7中所有導(dǎo)航欄都為半透明狼渊,導(dǎo)航欄(height=44)和狀態(tài)欄(height=20)不...
    LZM輪回閱讀 6,093評論 1 4
  • 曾經(jīng)有一段時間箱熬,我的工作非常忙碌,忙到除了睡覺吃飯的時間狈邑,其他時間都在工作城须。而且為了最高效地處理工作,防止工...
    妙貝閱讀 767評論 0 1
  • 正確寫法應(yīng)該是:弗洛伊德 弗洛伊德生平 作為一個治療精神疾病的醫(yī)生米苹,弗洛伊德創(chuàng)立了一個涉及人類心理結(jié)構(gòu)和功能的學(xué)說...
    昭的私房家伙閱讀 514評論 0 0