IOS開發 單例模式安全寫法

2021-07-14 13:30:28 字數 1184 閱讀 9922

一般情況我們都是這麼寫:

static mysingleton *sharesingleton;

+( instancetype ) sharedsingleton  {

static  dispatch_once  oncetoken;

dispatch_once ( &oncetoken, ^ {

sharesingleton = [ [ mysingleton alloc ] init ] ;

return sharedsingleton;

但是呼叫shareinstance方法時獲取到的物件是相同的,但是當我們通過alloc和init來構造物件的時候,有時候得到的物件卻是不一樣的。建立物件的步驟分為申請記憶體(alloc)、初始化(init)這兩個步驟,我們要確保物件的唯一性,因此在第一步這個階段我們就要攔截它。當我們呼叫alloc方法時,oc內部會呼叫allocwithzone這個方法來申請記憶體,我們覆寫這個方法,然後在這個方法中呼叫shareinstance方法返回單例物件,這樣就可以達到我們的目的。拷貝物件也是同樣的原理,覆寫copywithzone方法,然後在這個方法中呼叫shareinstance方法返回單例物件。所以建議以後安全一點都這麼寫:

static  mysingleton  *sharesingleton = nil;

+( instancetype ) sharedsingleton  {

static  dispatch_once  oncetoken;

dispatch_once ( &oncetoken, ^ {

sharesingleton  =  [[super allocwithzone:null] init] ;

return sharedsingleton;

+(id) allocwithzone:(struct _nszone *)zone {

return [singleton shareinstance] ; 

-(id) copywithzone:(struct _nszone *)zone {

return [singleton shareinstance] ;

友情提示一下:單例使用到 nsmutablearray 的時候,防止多個地方對它同時遍歷和修改的話,需要加原子屬性。並且property用strong,並且寫乙個遍歷和修改的方法。加上鎖. lock,unlock.。一般情況下考慮效能問題盡量避免使用鎖

iOS開發 單例設計模式

一 什麼是單例 單例 在記憶體中只有唯一的例項,並且提供乙個全域性的訪問方法!單例的好處 可以實現同乙份資源共享。二 單例設計 非全部封死,提供兩個建立物件的方式 1 可以選擇使用類方法,直接建立乙個單例物件 2 也可以選擇使用其他方式,如alloc init方式,建立非單例物件 在單例類的.m檔案...

iOS開發單例模式的簡單實用

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。目前具有執行緒安全的兩種單例寫法 第一種 i...

併發單例模式小總結

單例模式,設計模式中最常用也是最簡單的一種的設計模式。設計模式的作用或者說使用場合想必大家都知道,主要用在實際應用只需要例項化一次的場合,網上的例子也很多,什麼印表機的例子等等。我在專案中也是用過單例模式,當時是由於專案需要,需要在應用中動態配置資料庫連線池,而這種資料庫連線池的配置就只需要在單例模...