天天看點

單例模式及其在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;
}
           

結果展示一下:

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

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

如有不當,歡迎指正。