單例模式的書寫

iOS單例

1.單例模式是一種設(shè)計模式,為我們的程序提供一個公共的接口,即引入這個單例類的文件,我們不管在程序中的哪個地方聲明一個該類對象,其實都是同一個對象,啥都一樣。

2.單例模式的一般寫法


@interface SingleClass : NSObject

+(SingleClass *) shareInstance ;

@end


@implementation SingleClass
static SingleClass* instance = nil;

+(SingleClass*) shareInstance
{
    static dispatch_once_t onceToken ;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init] ;
    }) ;
    
    return instance ;
}
@end

SingleClass *class1 = [SingleClass shareInstance];
    
SingleClass *class2 = [SingleClass shareInstance];

以上兩個對象其實是單例的目的,但是我們在取單例聲明該單例對象的時候,必須以上邊這個靜態(tài)方法

但是下邊這種聲明對象的方法,其實在堆中alloc一個空間,與上邊就不是一個對象了,單例的目的就失效了,所以要這樣寫單例,必須保證每次聲明對象都用“shareInstance”方法
SingleClass *class3 = [[SingleClass alloc] init];

那么問題就來了,我們通過不同的途徑得到不同的對象,顯然是不行的。我們必須要確保對象的唯一性,所以我們就需要封鎖用戶通過alloc和init以及copy來構(gòu)造對象這條道路。我們知道,創(chuàng)建對象的步驟分為申請內(nèi)存(alloc)、初始化(init)這兩個步驟,我們要確保對象的唯一性,因此在第一步這個階段我們就要攔截它。當(dāng)我們調(diào)用alloc方法時,oc內(nèi)部會調(diào)用allocWithZone這個方法來申請內(nèi)存,我們覆寫這個方法,然后在這個方法中調(diào)用shareInstance方法返回單例對象,這樣就可以達(dá)到我們的目的??截悓ο笠彩峭瑯拥脑?,覆寫copyWithZone方法,然后在這個方法中調(diào)用shareInstance方法返回單例對象??创a吧:

static SingleClass* instance = nil;
@implementation SingleClass


+(SingleClass*) shareInstance
{
    static dispatch_once_t onceToken ;
    dispatch_once(&onceToken, ^{
        instance = [[self allocWithZone:NULL] init] ;
    }) ;
    
    return instance ;
}

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

- (id)copy {
    return [SingleClass shareInstance];
}

這樣的話,上邊的三個對象就完全一樣了,及同一個對象

下邊也是寫單例的一種放法

#import "SingleClass.h"

static SingleClass* instance = nil;
@implementation SingleClass


+(SingleClass*) shareInstance
{
    @synchronized(self) {
        if(!instance) {
            instance = [[SingleClass alloc] init];
        }
    }
    
    return instance ;
}

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

- (id)copy {
    return [SingleClass shareInstance];
}


@end
最后編輯于
?著作權(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)容

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