IOS單例模式及單例模式的優缺點

2021-06-21 11:02:49 字數 2450 閱讀 2464

單例模式的意思就是只有乙個

例項。單例模式確保某乙個類只有乙個例項,而且自行

例項化並向整個系統提供這個例項。這個類稱為單例類。

#import

@inte***ce

singleton : nsobject

+(singleton *) getinstance;

@end

@implementation

singleton

+(singleton *) getinstance

}return

sharedsingleton_; }

+ (id) allocwithzone:(nszone *)zone

- (id) copywithzone:(nszone*)zone

- (id

) retain

-(nsuinteger) retaincount

//oneway用在分布式物件的api,這些api可以在不同的執行緒,甚至是不同的程式。oneway關鍵字只用在返回型別為void的訊息定義中, 因為oneway是非同步的,其訊息預計不會立即返回。

-(oneway

void

)release

- (id

) autorelease

@end

當然,ios 5以上啟用arc就簡單多了:

static rootviewcontroller* sharedrootcontroller =nil;

+(rootviewcontroller *) sharedcontroller

}return

singlecontroller;

}

單例模式的優缺點

1、時間和空間

比較上面兩種寫法:懶漢式是典型的時間換空間,也就是每次獲取例項都會進行判斷,看是否需要建立例項,浪費判斷的時間。當然,如果一直沒有人使用的話,那就不會建立例項,則節約記憶體空間。

餓漢式是典型的空間換時間,當類裝載的時候就會建立類例項,不管你用不用,先建立出來,然後每次呼叫的時候,就不需要再判斷了,節省了執行時間。

2、執行緒安全

(1)從執行緒安全性上講,不加同步的懶漢式是執行緒不安全的,比如,有兩個執行緒,乙個是執行緒a,乙個是執行緒b,它們同時呼叫getinstance方法,那就可能導致併發問題。如下示例:

public static  singleton getinstance()  

return instance;  

程式繼續執行,兩個執行緒都向前走了一步,如下:

public static  singleton getinstance()  

return instance;  

可能有些朋友會覺得文字描述還是不夠直觀,再來畫個圖說明一下,如圖5.4所示。

通過圖5.4的分解描述,明顯地看出,當a、b執行緒併發的情況下,會建立出兩個例項來,也就是單例的控制在併發情況下失效了。

(2)餓漢式是執行緒安全的,因為虛擬機器保證只會裝載一次,在裝載類的時候是不會發生併發的。

(3)如何實現懶漢式的執行緒安全呢?

當然懶漢式也是可以實現執行緒安全的,只要加上synchronized即可,如下:

public static synchronized singleton getinstance(){} 

但是這樣一來,會降低整個訪問的速度,而且每次都要判斷。那麼有沒有更好的方式來實現呢?

(4)雙重檢查加鎖

可以使用"雙重檢查加鎖"的方式來實現,就可以既實現執行緒安全,又能夠使效能不受到很大的影響。那麼什麼是"雙重檢查加鎖"機制呢?

所謂雙重檢查加鎖機制,指的是:並不是每次進入getinstance方法都需要同步,而是先不同步,進入方法過後,先檢查例項是否存在,如果不存在才進入下面的同步塊,這是第一重檢查。進入同步塊過後,再次檢查例項是否存在,如果不存在,就在同步的情況下建立乙個例項,這是第二重檢查。這樣一來,就只需要同步一次了,從而減少了多次在同步情況下進行判斷所浪費的時間。

雙重檢查加鎖機制的實現會使用乙個關鍵字volatile,它的意思是:被volatile修飾的變數的值,將不會被本地執行緒快取,所有對該變數的讀寫都是直接操作共享記憶體,從而確保多個執行緒能正確的處理該變數。

看看**可能會更加清楚些。示例**如下:

public class singleton   

public static  singleton getinstance()  

}  }  

return instance;  

}  } 

這種實現方式可以實現既執行緒安全地建立例項,而又不會對效能造成太大的影響。它只是在第一次建立例項的時候同步,以後就不需要同步了,從而加快了執行速度。

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

IOS 單例模式

單例模式顧名思義就是只有乙個例項,它確保乙個類只有乙個例項,並且自行例項化並向整個系統提供這個例項。它經常用來做應用程式級別的共享資源控制。這個模式使用頻率非常高,通過乙個單例類,可以實現在不同視窗之間傳遞資料。在objective c中要實現乙個單例類,至少需要做以下四個步驟 1 為單例物件實現乙...

iOS 單例模式

最近在ios開發中,需要用到單例模式,於是自己動手寫了乙個,它看起來是這樣的 1 id sharedinstance return sharedinstance 後來發現許多書上的做法都使用到了bool變數作為標值位,它看起來是這樣的 2 id sharedinstance return share...