+ (void)initialize,且整個程式執行期間只會呼叫一次(子類別若未覆寫,會繼承父類別的 initialize,但仍只呼叫一次);// InitTest.m
+ (void)initialize {
NSLog(@"InitTest initialize: %@", [self class]);
}
- (instancetype)init {
self = [super init];
if (self) NSLog(@"InitTest init");
return self;
}
// 子類別 InitTestChild 未覆寫 initialize
// ViewController.m
InitTest *t1 = [[InitTest alloc] init];
InitTest *t2 = [[InitTest alloc] init];
InitTestChild *c = [[InitTestChild alloc] init];
// 輸出:
// InitTest initialize: InitTest
// InitTest init
// InitTest init
// InitTest initialize: InitTestChild
// InitTest init
static InitTest *sharedInstance = nil;
+ (void)initialize {
if (sharedInstance == nil) {
sharedInstance = [[self alloc] init];
}
}
+ (instancetype)defaultManager {
return sharedInstance;
}
優點:無需 dispatch_once,語法簡潔,天然線程安全(initialize 由 runtime 保證只執行一次)。
dispatch_once 配合 allocWithZone: 覆寫;