所以我有一个单例,我试图理解这两种实现之间的区别:从功能上讲,我已经尝试用它们运行我的代码,它们都可以工作
但是,我注意到在第一个实现中没有调用 [self alloc],而是调用了 [super alloc]。我对此有点困惑。它似乎有效,但似乎有点神奇所以我想知道是否有人可以澄清
第一种方式:
+(id)getSingleton
{
static dispatch_once_t pred;
dispatch_once(&pred, ^{
locMgrSingleton = [[super alloc] init];
});
return locMgrSingleton;
}
其他方式
+(id)getSingleton
{
@synchronized(self)
{
if (locMgrSingleton == nil)
{
locMgrSingleton = [[self alloc]init];
NSLog(@"Created a new locMgrSingleton");
}
else
{
NSLog(@"locMgrSingleton exists");
}
}
return locMgrSingleton;
}
最佳答案
除非类也覆盖 [self alloc]
,否则使用 [super alloc]
与 +alloc
没有区别。也就是说,它应该调用 [self alloc]
。我敢打赌它正在调用 super
因为这可能是从重写 +alloc
以返回单例的实现中改编的。
在任何情况下,除了 self
与 super
之外,这两种模式之间的区别在我对 this other question 的回答中进行了解释,但简而言之, dispatch_once()
是实现此目的的现代方法。它比 @synchronized
更快,并且具有更多的语义含义。
关于ios - 目标 C 中线程安全初始值设定项的这两种实现之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14884529/