这些单例实现之间有什么区别:
在sharedManager函数之外声明静态实例
@implementation MyManager
static MyManager * manager = nil;
+(instancetype)sharedManager
{
@synchronized(self) {
if(manager==nil){
manager = [[MyManager alloc]init];
}
return manager;
}
}
2
在sharedManager函数中声明静态实例
@implementation MyManager
+(instancetype)sharedManager
{
static MyManager * manager = nil;
@synchronized(self) {
if(manager==nil){
manager = [[MyManager alloc]init];
}
return manager;
}
}
@end
4
+ (instancetype)sharedManager {
static MyManager *singleton=nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
singleton = [[self alloc] init];
});
return singleton;
}
答案 0 :(得分:2)
你应该在accessor方法中使它成为一个静态变量。这可以防止您在正确初始化之前意外访问它。
安全地初始化单身人士的现代方法是这样的:
+ (instancetype)sharedManager {
static MyManager *singleton;
static dispatch_once_t once;
dispatch_once(&once, ^{
singleton = [[self alloc] init];
});
return singleton;
}
如果已经执行了一次块,则 dispatch_once
明显快于@synchronized
。