iOS--設計模式之單例模式

這個是多年前寫的了,如今修改了下格式搬到了我們簡書網的平臺,希望大家喜歡。

單例模式是iOS設計模式中常用到的設計模式之一,常用于網絡數據請求,數據庫操作等頻繁調用的模塊,作用呢很簡單,就是節省內存,避免對統一操作進行多次內存開辟而造成不必要的內存浪費。

廢話不多說了,直接上代碼:

新建Singleton類

.h文件
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
+(Singleton *)singleton;
@end

.m文件
#import "Singleton.h"

static Singleton *share = nil;

@implementation Singleton

+(Singleton *)singleton{   
     @synchronized(self) {       
         if(share == nil) {           
             share = [[[self class] alloc] init];       
         }    
     }    
    return share;
}
@end

OK,到此以前的我覺得已經寫完一個單例類了,很多初學者也只是寫到這一步,確實僅憑這些代碼可以完成單例的實現,但是在實際運用過程中他是有缺陷的。

比如在團隊合作過程中,另一個程序猿并不知道這個類是單例類,用alloc init來實現一個對象,那么這個對象就是這個類的普通對象,所以說到這里你應該知道問題所在了吧。

解決上述問題其實也簡單,只需要重寫allocWithZone方法,保證即使有人使用alloc init方法獲取的依舊是已存在的單例(或者第一次創建時走單例方法)。

我們需要修改.m代碼如下:

#import "Singleton.h"

static Singleton *share = nil;

@implementation Singleton

+ (Singleton *)singleton{   
     @synchronized(self) {       
         if(share == nil) {           
            share = [[super allocWithZone:NULL] init];       
         }    
     }    
    return share;
}

+ (instancetype) allocWithZone:(struct _NSZone *)zone{
    return [self singleton];
}

@end

OK,這樣就可以確保無論誰怎么使用這個類,最終獲取的都是同一個單例。

細心的初學者朋友可能會對這句話有問題:@synchronized(self)@synchronized的作用是創建一個互斥鎖,防止self對象在同一時間內被其它線程訪問,起到線程的保護作用。

最后再給出一個高大上的方法(GCD實現單例),這算是比較高階的寫法了,只需要對singleton方法進行如下修改:
+ (Singleton*) singleton{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
share = [[super allocWithZone:NULL] init];
});
return share;
}

創造即永恒,喝茶去……

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,529評論 1 8
  • 前文提要: 之前簡友說讓舉栗子,那么今天我們就來舉栗子。前文傳送門:iOS設計模式、架構模式、框架簡介之《設計模式...
    Fun箱Dao柜閱讀 1,894評論 1 51
  • 單列模式:整個程序的生命周期內,只會創建一個類的實例化對象,而且只要程序還在運行,實例對象就不會釋放。 ·單例模式...
    墨凌風起閱讀 344評論 0 0
  • 如果覺得我寫的還不錯,請關注我的新浪微博@小橘爺,最新文章即時推送~ 單例模式 單例模式的作用是解決“應用中只有一...
    小橘爺閱讀 503評論 2 1
  • 粗體驗 隨便點擊了幾個,界面感覺挺清爽的,大塊的留白,黑白藍為主,強調色用的很克制主要的界面分為首頁,發現,消息和...
    靜默之思閱讀 542評論 0 52