單例創(chuàng)建的幾種方法

方法一、(官方版)

這個方法為蘋果公司官方的方法;

static id _sharedManager = nil;

+ (instancetype)defaultManager {
        if (_sharedManager == nil) {
            _sharedManager = [[super allocWithZone:NULL] init];
        }
    return _sharedManager;
}

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

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

解釋:

[[Class alloc] init];其實是做了兩件事。 alloc 給對象分配內(nèi)存空間,init是初始化對象,包括設(shè)置成員變量初值等。而給對象分配空間,除了alloc方法之外,還有另一個方法: + (instancetype)allocWithZone: 。
而使用alloc方法初始化一個類的實例的時候,默認調(diào)用了+ (instancetype)allocWithZone: 方法,所以創(chuàng)建單例覆蓋這個方法也是必須的了。

方法二、(完整版)

//全局變量
static id _sharedManager = nil;

//單例方法
+(instancetype)shareManager{
    return [[self alloc] init];
}

//初始化方法
- (instancetype)init{
    // 只進行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedManager = [super init];
    });
    return _sharedManager;
}

//alloc會調(diào)用allocWithZone:
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    //只進行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedManager = [super allocWithZone:zone];
    });
    return _sharedManager;
}

//如果不刻意調(diào)用[object copy]?方法,下面的方法可以不使用
//copy會調(diào)用copyWithZone:
- (id)copyWithZone:(NSZone *)zone{
    return _sharedManager;
}

+ (id)copyWithZone:(struct _NSZone *)zone{
    return _sharedManager;
}

//mutableCopy會調(diào)用mutableCopyWithZone:
- (id)mutableCopyWithZone:(NSZone *)zone{
    return _sharedManager;
}

+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
    return _sharedManager;
}

解釋:

dispatch_once不僅意味著代碼僅會被運行一次,而且還是線程安全的,這就意味著你不需要使用諸如@synchronized之類的來防止使用多個線程或者隊列時不同步的問題。
對象是可以被copy/mutableCopy的,為了讓被copy的對象也是“唯一”的,需要覆蓋copy/mutableCopy的方法(如果可以保證不使用copy方法可以忽略這些方法的覆蓋)

方法三、(簡易版)

確保項目中只使用[Class shareManager]調(diào)用該類時可以用這個簡易的方法。不能使用[[Class alloc] init];[object copy];這些方法調(diào)用呦~

+ (instancetype)shareManager {
    static ZingChatManager *_sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedManager = [[Class alloc] init];
    });
    return _sharedManager;
}
最后編輯于
?著作權(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)容