最近在ios開發中,需要用到單例模式,於是自己動手寫了乙個,它看起來是這樣的:
<1>
+ (id)sharedinstance
return sharedinstance;
}
後來發現許多書上的做法都使用到了bool變數作為標值位,它看起來是這樣的:
<2>
+ (id)sharedinstance
return sharedinstance;
}
<3>
+ (id)sharedinstance
);
return sharedinstance;
}
另外一種執行緒安全的方法:
<4>
+ (qlog *)log
// see comment in header.}}
return slog;
}
那麼它們究竟有多大區別呢?
原來,它們的區別在於多執行緒併發時的表現。
<1>使用了乙個指標變數作為標誌位,這在多執行緒併發時是不可取的,因為sharedinstance = [[nsobject alloc] init];這行**的執行本身是需要時間的。很可能有兩個執行緒同時進入到了這行**,而這將導致記憶體洩漏。
<2>使用的標誌位是乙個bool變數,當多執行緒併發時,會出現1執行緒判斷為no,開始alloc並做賦值操作,但是2執行緒進入時判斷為yes,而1執行緒賦值操作還沒執行結束,這時候2執行緒會拿到乙個nil。儘管它不會造成記憶體洩漏,但是它會有相當多的執行緒獲取不到物件。
該函式接收乙個dispatch_once_t用於檢查該**塊是否已經被排程的謂詞(是乙個長整型,實際上作為bool使用)。它還接收乙個希望在應用的生命週期內僅被排程一次的**塊。這不僅意味著**僅會被執行一次,而且還是執行緒安全的,你不需要使用諸如@synchronized之類的來防止使用多個執行緒或者佇列時不同步的問題。
如果被多個執行緒呼叫,該函式會同步等等直至**塊完成。
IOS 單例模式
單例模式顧名思義就是只有乙個例項,它確保乙個類只有乙個例項,並且自行例項化並向整個系統提供這個例項。它經常用來做應用程式級別的共享資源控制。這個模式使用頻率非常高,通過乙個單例類,可以實現在不同視窗之間傳遞資料。在objective c中要實現乙個單例類,至少需要做以下四個步驟 1 為單例物件實現乙...
iOS 單例模式
在objective c中要實現乙個單例類,至少需要做以下四個步驟 1 為單例物件實現乙個靜態例項,並初始化,然後設定成nil,2 實現乙個例項構造方法檢查上面宣告的靜態例項是否為nil,如果是則新建並返回乙個本類的例項,3 重寫allocwithzone方法,用來保證其他人直接使用alloc和in...
iOS 單例模式
顧名思義,單例就是在乙個工程裡面只有乙個例項。1.單例模式的要點 顯然單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。2.單例模式的優點 1.例項控制 singleton 會阻止其他物件例項化其自己的 singleton 物件的副本,...