淺談iOS中的單例模式

iOS中的單例模式設計模式

    就我自己理解而言,我認爲的單例:單例在整個工程中,就至關於一個全局變量,就是不論在哪裏須要用到這個類的實例變量,均可以經過單例方法來取得,並且一旦你建立了一個單例類,不論你在多少個界面中初始化調用了這個單例方法取得對象,它們全部的對象都是指向的同一塊內存存儲空間(即單例類保證了該類的實力對象是惟一存在的一個).緩存

    「單例模式」是咱們在iOS中最常使用的設計模式之一。單例模式不須要傳遞任何參數,就有效地解決了不一樣代碼間的數據共享問題。單例類是一個很是重要的概念,由於它們表現出了一種十分有用的設計模式。單例類的應用貫穿於整個iOS的SDK中。例如,UIApplication類有一個方法叫sharedApplication,從任何地方調用這個方法,都將返回與當前正在運行的應用程序相關聯的UIApplication實例。除了這個,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(持久化存儲數據) 、NSURLCache(請求緩存)、NSHTTPCookieStorage(應用程序cookies池)都是系統單例;cookie

單例類保證了應用程序的生命週期中有且僅有一個該類的實例對象,並且易於外界訪問。spa

    單例模式的優勢:線程

 1.實例控制:Singleton 會阻止其餘對象實例化其本身的 Singleton 對象的副本,從而確保全部對象都訪問惟一實例。
 2.靈活性:由於類控制了實例化過程,因此類能夠更加靈活修改實例化過程。
    單例類的實現方法:
    (1).經過加線程鎖進行實現:
 好比建立了一個DBManager的類
 +(DBManager *)sharedManager;    (.h文件中)
 
 .m文件中的實現:
 +(DBManager *)sharedManager{
  Static DBManager *manager = nil;
  @synchronized(self){
  if(manager == nil){
    manager = [[DBManager alloc]init];
     }
   }
  return manager;
}
 
 
    (2).經過GCD實現單例方法:
  +(DBManager *)sharedManager;    (.h文件中)
 
 .m文件中的實現:
 +(DBManager *)sharedManager{
  Static DBManager *manager = nil;
      static dispatch_once_t token;
      dispatch_once(&token,^{
              if(manager == nil){
           manager = [[DBManager alloc]init];
        }
   } );
  return manager;
}
 
     重寫allocWithZone方法,用來保證其餘人直接使用alloc和init試圖得到一個新實力的時候不產生一個新實例,
+(id)allocWithZone:(NSZone *)zone{
    @synchronized(self){
        if (!manager) {
            manager = [super allocWithZone:zone]; //確保使用同一塊內存地址
            return manager;
        }
        return nil;
    }
}

    適當實現copyWithZone,release和autorelease
- (id)init;
{
    @synchronized(self) {
        if (self = [super init]){
            return self;
        }
        return nil;
    }
}
相關文章
相關標籤/搜索