天天看點

ios之單例模式

單例模式是iOS開發中非常重要的一種模式,一般用在隻允許建立一個變量的地方,什麼地方隻允許建立一個變量呢?例如手機上的硬體對象:相機、GPS、藍牙等。如果要使用這些硬體對象,就隻能共享一個資源。。。千萬不要以為這些硬體對象可以多次alloc出來,當成多個對象來使用,那是不可能的,因為這些硬體隻有一個。這種情況下就需要用到單例模式了,建立單例模式的方法有很多種,ios4前後是不一樣的,在這裡我用一種最簡單、易懂的方法,也就是通過GCD的方式來建立單例模式。

分為三步來建立:

第一步:

建立一個共享執行個體的靜态變量

ios之單例模式

使用靜态變量可以使這個執行個體能夠在程式生命周期内一直存活,提供給程式使用,當然你也可以用全局變量來代替靜态變量,但還是建議最好使用靜态變量,防止檔案導入時

命名沖突。

第二步:

建立shareInstance方法來實作單例

ios之單例模式

dispatch_once的作用時確定block裡面的函數隻執行一次,并保證了多線程通路時的安全性,這點在多線程的情況非常重要,因為繼續有所程式都是多線程運作的,是以確定多線程通路安全是很有必要的。這裡注意紅線部分畫出的super,千萬不要用self啊,否則會造成循環引用,程式卡死,不信自己可以試試。(也不要将allocWithZone換成alloc,因為allocWithZone是和下面重寫的方法對應的)

下面重寫兩個方法即可:

ios之單例模式

重寫的第一個方法是為了防止如果使用alloc和init方法來建立了一個對象,造成單例被配置設定了多個不同的記憶體空間,這是不允許發生的。

重寫的第二個方法,是為了防止使用copy時複制對象造成單例又被多次配置設定,當然一般情況下這個函數用不着,你也可以不重寫。但第一個必須重寫!

到此為止,單例模式就寫好了,下面來開看看列印結果:

ios之單例模式
ios之單例模式

記憶體位址空間都是一樣的吧。。