標籤:www. 優缺點 imp div stat 全域變數 == 建立 線程鎖
一. 單例模式簡介
單例模式的作用
可以保證在程式運行過程,一個類只有一個執行個體,而且該執行個體易於供外界訪問
從而方便地控制了執行個體個數,並節約系統資源
單例模式的使用場合
在整個應用程式中,共用一份資源(這份資源只需要建立初始化1次),一般用於工具類。例如:登陸控制器,網路資料請求,音樂播放器等一個工程需要使用多次的控制器或方法。
單例模式的優缺點
優點:
單例模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問,從而方便對執行個體個數的控制並節約系統資源。
如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
單例模式因為類控制了執行個體化過程,所以類可以更加靈活修改執行個體化過程。
缺點:
單例對象一旦建立,對象指標是儲存在靜態區的,單例對象在堆中分配的記憶體空間,會在應用程式終止後才會被釋放。
單例類無法繼承,因此很難進行類的擴充。
單例不適用於變化的對象,如果同一類型的對象總是要在不同的用例情境發生變化,單例就會引起資料的錯誤,不能儲存彼此的狀態。
注意:我們在使用單例類之前,一定要考慮好單例類是否適合和類以後的擴充性,避免盲目濫用單例
二. 單例在ARC中的實現
ARC中單例實現步驟
1 在類的內部提供一個static修飾的全域變數
2 提供一個類方法,方便外界訪問
3 重寫+allocWithZone方法,保證永遠都只為單例對象分配一次記憶體空間
4 嚴謹起見,重寫-copyWithZone方法和-MutableCopyWithZone方法
ARC中單例代碼實現
#import "Tools.h"@implementation Tools// 建立靜態對象 防止外部存取static Tools *_instance;+(instancetype)allocWithZone:(struct _NSZone *)zone{// @synchronized (self) {// // 為了防止多線程同時訪問對象,造成多次分配記憶體空間,所以要加上線程鎖// if (_instance == nil) {// _instance = [super allocWithZone:zone];// }// return _instance;// } // 也可以使用一次性代碼 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (_instance == nil) { _instance = [super allocWithZone:zone]; } }); return _instance;}// 為了使執行個體易於外界訪問 我們一般提供一個類方法// 類方法命名規範 share類名|default類名|類名+(instancetype)shareTools{ //return _instance; // 最好用self 用Tools他的子類調用時會出現錯誤 return [[self alloc]init];}// 為了嚴謹,也要重寫copyWithZone 和 mutableCopyWithZone-(id)copyWithZone:(NSZone *)zone{ return _instance;}-(id)mutableCopyWithZone:(NSZone *)zone{ return _instance;}
轉自:http://www.jianshu.com/p/4867dc92337e
iOS-單例模式