單例模式的安全創(chuàng)建法

單例外部環(huán)境不可控,內(nèi)部可控。所有要保證單例唯一,就只有在其.m內(nèi)實現(xiàn)。

使用情景

高頻率去生產(chǎn)一個對象,然后又釋放。讓多個不相關(guān)的類共享數(shù)據(jù)。

創(chuàng)建單例

.h

//
//  SafeSingleton.h
//  OC基礎(chǔ)
//
//  Created by FYJMac on 2018/5/2.
//  Copyright ? 2018年 FYJMac. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface SafeSingleton : NSObject
//創(chuàng)建或獲取單例對象
+ (instancetype)sharedSafeSingleton;
//注銷單例對象
- (void)cancelShare;

@end

.m

//
//  SafeSingleton.m
//  OC基礎(chǔ)
//
//  Created by FYJMac on 2018/5/2.
//  Copyright ? 2018年 FYJMac. All rights reserved.
//

#import "SafeSingleton.h"

@implementation SafeSingleton

static SafeSingleton *singleton;

//load是第一次加載該類時觸發(fā)(不管有沒有調(diào)用);initialize時第一次使用該類時觸發(fā)
+ (void)initialize
{
    [SafeSingleton sharedSafeSingleton];
}

+ (instancetype)sharedSafeSingleton
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singleton = [[SafeSingleton alloc] init];
    });
    return singleton;
}

//防止被創(chuàng)建多個
+ (instancetype)alloc
{
    if (singleton) {
        //拋出一個異常,通常是在寫框架的時候用到
        NSException *exception = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Singleton indtance." userInfo:nil];
        [exception raise];
    }
    return [super alloc];
}


- (void)cancelShare
{
    singleton = nil;
}
最后編輯于
?著作權(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)容