1. 程式人生 > >單例模式及其在iOS中的應用

單例模式及其在iOS中的應用

單例模式(Singleton Pattern) 確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項,這個類成為單例類,它提供全域性訪問方法。

單例模式三要點:

  1. 某個類只能有一個例項
  2. 它必須自行建立這個例項
  3. 它必須自行向整個系統提供這個例項

使用場景:當一個系統要求只有一個例項時可使用單例模式。

iOS 單例的兩種寫法:
第一種:

//1.設定成靜態全域性變數
static Setting *set = nil;

+(Setting *)sharedSetting{

    @synchronized(self){//2.保證執行緒安全
    // 3.當物件不存在時,建立物件,第二次再呼叫方法的時候,由於set是靜態的,所以不為空,不會再重新建立物件
if (!set) { set = [[Setting alloc]init]; } } //返回自己 return set; } //這個方法是在呼叫alloc方法時,alloc內部實際呼叫的建立物件的方法 //我們重寫這個方法,保證在這個方法的內部建立的物件就是set物件即可 +(id)allocWithZone:(struct _NSZone *)zone{ @synchronized(self){ if (!set) { set = [super allocWithZone:zone]; } } return
set; }

第二種:

+ (id)sharedSetting{

    static Setting *setting = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        setting = [[self alloc] init];
    });

    return setting;
}

+(id)allocWithZone:(struct _NSZone *)zone{

    static Setting *setting = nil;
    static
dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ setting = [super allocWithZone:zone]; }); return setting; }

以上兩種方法對於只用【shareSetting】類方法獲取的話【allocWithZone】方法建立例項是可以不重寫的,但是,為防止一不小心用alloc方法建立例項,座椅最好還是重寫一下。而且在實際中,為保證物件的絕對唯一,並不是只需重寫這一個方法,還有 copyWithZone 等

//注意:在實際中,若想保證物件的絕對唯一,並不是只需重寫這一個方法,還有 copyWithZone 等
//實現這個方法的類
- (id)copyWithZone:(nullable NSZone *)zone{
    return self;
}

- (id)mutableCopyWithZone:(nullable NSZone *)zone{

    return self;
}

結果展示一下:
這裡寫圖片描述

其中要想對copyWithZone方法進行進一步瞭解的點這裡

如有不當,歡迎指正。