Swift
swift 3.0中廢棄了dispatch_once,這里只記錄一個標準的單例寫法,具體相關的內容,可以看看這篇文章;
代碼:
import UIKit
class SingleOnce {
// 單例
static let shared = SingleOnce.init()
private init(){}
// 其他方法
}
這里將init方法私有化了,這樣在其他地方就無法init,保證了單例的唯一性.
PS: 如果繼承自其他類,init方法要加override關鍵字
使用:
如果,在外部調用init方法,會編譯報錯:
Objective-C
在OC中, 我們可以這樣寫:
+ (instancetype)once {
return [[self alloc] init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
static LQOnce *__once;
dispatch_once(&onceToken, ^{
__once = [[super allocWithZone:NULL]init];
});
return __once;
}
這樣, 我們在使用的時候, 無論是調用once 方法, 還是init方法, 都會得到同一個實例對象:
LQOnce *once1 = [LQOnce once];
NSLog(@"%@", once1);
LQOnce*once2 = [[LQOnce alloc]init];
NSLog(@"%@", once2);
輸出:
<LQOnce: 0x60400000cf60>
<LQOnce: 0x60400000cf60>