前言:做IOS研發(fā)已經(jīng)四年多了,一路走來發(fā)現(xiàn)一直泡在業(yè)務(wù)邏輯中,感覺還是要靜下心總結(jié)一下相關(guān)的技術(shù)點(diǎn),如有不對(duì)的地方歡迎指出,大牛勿噴。
一 ?什么是單利:
1.確保在程序運(yùn)行過程中只創(chuàng)建一個(gè)對(duì)象實(shí)例
2.可以用于需要被多次廣泛或者說多次使用的資源中
二 單利的創(chuàng)建 :
1.基礎(chǔ)單利創(chuàng)建
為了隔絕外部的修改,要使用static靜態(tài)變量
加鎖是考慮到多線程調(diào)用時(shí)候的安全問題

同時(shí)也可以用GCD來創(chuàng)建單利,兩者的效率是有很大的差異的,用dispatch_once的性能會(huì)提高很多,至于對(duì)比請(qǐng)參考這里

考慮到可能會(huì)不小心調(diào)用alloc,allocWithZone,copy,mutableCopy等方法,因此避免出現(xiàn)崩潰的情況,可以對(duì)以上幾個(gè)方法進(jìn)行重寫,使代碼的安全性更高.

至此一個(gè)完整的單利就寫完了,既然單利寫完了。
順便附上Swift的寫法

三 優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
1、提供了對(duì)唯一實(shí)例的受控訪問。
2、由于在系統(tǒng)內(nèi)存中只存在一個(gè)對(duì)象,因此可以節(jié)約系統(tǒng)資源,對(duì)于一些需要頻繁創(chuàng)建和銷毀的對(duì)象單例模式無疑可以提高系統(tǒng)的性能。
3、因?yàn)閱卫J降念惪刂屏藢?shí)例化的過程,所以類可以更加靈活修改實(shí)例化過程。
缺點(diǎn)
1、由于單利模式中沒有抽象層,因此單例類的擴(kuò)展有很大的困難。
2、單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原則”。
四 單利存在的問題
? ? ? ?1、單例模式實(shí)際上延長了對(duì)象的生命周期。那么就存在內(nèi)存問題。因?yàn)檫@個(gè)對(duì)象在程序的整個(gè)生命都存在。所以當(dāng)這個(gè)單例比較大的時(shí)候,總是hold住那么多內(nèi)存,就需要考慮這件事了。另外,可能單例本身并不大,但是它如果強(qiáng)引用了另外的比較大的對(duì)象,也算是一個(gè)問題。別的對(duì)象因?yàn)閱卫龑?duì)象不釋放而不釋放。當(dāng)然這個(gè)問題也有一定的辦法。比如對(duì)于一些可以重新加載的對(duì)象,在需要的時(shí)候加載,用完之后,單例對(duì)象就不再強(qiáng)引用,從而把原先hold住的對(duì)象釋放掉。下次需要再加載回來。
? ? ? ?2、在開發(fā)過程中,單例對(duì)象可能有一些屬性,一般會(huì)放在init的時(shí)候創(chuàng)建和初始化。這樣,比如如果單例A的m屬性依賴于單例B,單例B的屬性n依賴于單例A,初始化的時(shí)候就會(huì)出現(xiàn)死循環(huán)依賴。死在dispatch_once里。對(duì)于這種情況,最好的設(shè)計(jì)是在單例設(shè)計(jì)的時(shí)候,初始化的內(nèi)容不要依賴于其他對(duì)象。如果實(shí)在要依賴,就不要讓它形成環(huán)。實(shí)在會(huì)形成環(huán)或者無法控制,就采用異步初始化的方式。先過去,內(nèi)容以后再填。內(nèi)部需要做個(gè)標(biāo)識(shí),標(biāo)識(shí)這個(gè)單例在造出來之后,不能立刻使用或者完整使用。
五 單利的銷毀
1.將static dispatch_once_t onceToken; 這個(gè)拿到函數(shù)體外,使之成為全局的.
2.創(chuàng)建釋放方法,并在方法中將onceToken置為0,因?yàn)檫@樣,GCD才會(huì)認(rèn)為它從未執(zhí)行過.它默認(rèn)為0.這樣才能保證下次再次調(diào)用shareInstance的時(shí)候,再次創(chuàng)建對(duì)象.
3.單利對(duì)象release,并置為nil即可。
參考文獻(xiàn):