iOS 單例模式的寫法

單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。意思只有一個實例。

錯誤寫法(非線程安全)

#import "DataSource.h"
@implementation DataSource
+ (DataSource *)shareDataSource {
    static DataSource *dataSource;
    if (dataSource == nil) {
        dataSource = [[DataSource alloc] init];
    }
    return dataSource;
}

正確寫法

#import "DataSource.h"
@implementation DataSource
+ (DataSource *)shareDataSource {
    static DataSource *dataSource;
    @synchronized(self){
        if (dataSource == nil) {
            dataSource = [[DataSource alloc] init];
        }
    }
    return dataSource;
}

synchronized 只是保證只有同一時間只有一個操作對當(dāng)前 self的操作。

GCD(推薦)

+(DataSource *)shareDataSource {
    
    static DataSource *dataSource = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        dataSource = [DataSource new];
    });
    return dataSource;
}

dispatch_once中代碼只執(zhí)行一次,它是同步方法,比 @synchronized快許多

普通寫法

#import "DataSource.h"
static DataSource *dataSource;
@implementation DataSource
+ (DataSource *)shareDataSource {
    
    if (!dataSource) {
        dataSource = [[DataSource allocWithZone:NULL] init];
    }
    return dataSource;
}

嚴格單例(官方)

盡管我們很少會使用到嚴格的單例模式,但當(dāng)真的需要的時候,還是可以實現(xiàn)的。
蘋果官方文檔提供了一個嚴格單例的實現(xiàn)(傳送門)。 其重載了allocWithZone:, copyWithZone, retain, retainCount, release, autorelease。使得這個實現(xiàn)變得無比復(fù)雜而難以理解和控制。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS單例模式的寫法 1、第一種 這種寫法很普通,就是設(shè)置一個對象類型的靜態(tài)變量,判斷這個變量是否為nil,來創(chuàng)建...
    凌巔閱讀 1,257評論 5 5
  • 單例模式 什么是單例模式? 單例模式想一個大獨裁者,他規(guī)定在他的國度里面,所有數(shù)據(jù)的訪問和請求都得經(jīng)過他,甚至你要...
    GitHubPorter閱讀 1,263評論 0 4
  • 單例一般作為:工具類 單例命名:一般情況下如果一個類是單例,那么就要提供一個類方法用于快速創(chuàng)建單例對象,而且這個類...
    甘哲157閱讀 1,830評論 0 15
  • 對于我而言,今天是很特別的一天,是我和彭先生戀愛4周年的紀(jì)念日。 4年的時間算的上愛情“小跑”了,畢竟我們是屬于身...
    酷那么塔塔閱讀 5,701評論 0 3
  • 今天和寶寶在路邊玩的時候,看見對面有六七個學(xué)生年紀(jì)的女孩子三三兩兩的走著,是我先注意到她們的,想著學(xué)校今天是不是應(yīng)...
    利萍閱讀 643評論 0 0

友情鏈接更多精彩內(nèi)容