所以我有一个单例,我试图理解这两种实现之间的区别:从功能上讲,我已经尝试用它们运行我的代码,它们都可以工作

但是,我注意到在第一个实现中没有调用 [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 以返回单例的实现中改编的。

在任何情况下,除了 selfsuper 之外,这两种模式之间的区别在我对 this other question 的回答中进行了解释,但简而言之, dispatch_once() 是实现此目的的现代方法。它比 @synchronized 更快,并且具有更多的语义含义。

关于ios - 目标 C 中线程安全初始值设定项的这两种实现之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14884529/

10-12 22:50