大家都知道一個(gè)應(yīng)用的deploymenttarget是決定了應(yīng)用所能工作的設(shè)備系統(tǒng)的最低版本,所以我們?cè)谠O(shè)置該target的時(shí)候都設(shè)置成了項(xiàng)目所支持的系統(tǒng)最低版本(為了最大程度的兼容),如果設(shè)置的高了,在低版本的設(shè)備上是無法正常安裝的,所以對(duì)于應(yīng)用的deployment target的設(shè)置我們大家一般都不會(huì)犯錯(cuò)誤。但是對(duì)于應(yīng)用依賴于lib庫(kù)時(shí)情況又有所不同:無論我們lib庫(kù)所設(shè)置的deployment target是多少,這個(gè)lib都可以正常的被加載,工程也會(huì)順利的通過編譯,并且安裝到設(shè)備上(決定能否安裝到設(shè)備上的唯一因素就是應(yīng)用的deployment target,而跟其依賴的lib庫(kù)的deployment target 無關(guān))。在這種情況下,很可能導(dǎo)致我們忽略一些問題,我舉個(gè)例子:
應(yīng)用a, 設(shè)置deployment target 4.3, 依賴庫(kù)b,b的deploymenttarget 7.0;我們把a(bǔ)打到一部ios7的設(shè)備上運(yùn)行不會(huì)有任何問題;在ios5的設(shè)備上運(yùn)行則會(huì)崩潰;我們連接真機(jī)調(diào)試的時(shí)候很可能看到以下的日志:lazy symbol binding failed: Symbol not found:_objc_setProperty_nonatomic.
我們可能會(huì)覺得奇怪,這個(gè)方法不是我調(diào)用的呀?沒錯(cuò),你沒有調(diào)用這個(gè)方法,是系統(tǒng)自己調(diào)用了這個(gè)方法,而且這個(gè)方法是6.0才開始有的,系統(tǒng)更改了屬性的底層實(shí)現(xiàn),而在你的設(shè)備的系統(tǒng)上不支持該方法,所以就會(huì)報(bào)這個(gè)錯(cuò)誤。
結(jié)論:我們所依賴的lib庫(kù)的deployment target不應(yīng)該高于應(yīng)用的deployment target,否則很可能報(bào)錯(cuò),而且這個(gè)錯(cuò)誤不一定是你直接調(diào)用的方法,很可能是系統(tǒng)底層代碼。
操作建議:在沒有技術(shù)要求的情況下(如lib庫(kù)依賴于某個(gè)版本的新功能),不要采用默認(rèn)的deployment target,而是盡可能的把lib庫(kù)的deployment target設(shè)置低一些,這樣能夠最大程度的保證兼容低版本的設(shè)備,也避免上述的奇怪問題的產(chǎn)生。