static MyClass *_instance = nil;
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
// 可選:重寫 allocWithZone 防止外部 alloc
+ (id)allocWithZone:(NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
dispatch_once 保證初始化代碼在整個程序生命周期內僅執行一次,且線程安全、無鎖開銷。onceToken 必須聲明為 static。allocWithZone 可阻止繞過 sharedInstance 直接 alloc/init 創建多實例。若單例內部有可變狀態,所有讀寫操作需用 @synchronized(self) 或併發隊列屏障保護,確保線程安全。