3

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

但是,我注意到在第一个实现中没有调用 [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;
 }
4

3 回答 3

4

使用[self alloc]vs[super alloc]没有区别,除非该类也覆盖+alloc. 也就是说,它应该调用[self alloc]. 我敢打赌它正在调用super,因为这可能是改编自覆盖+alloc以返回单例的实现。

self在任何情况下,除了vs之外,这两种模式之间的区别super在我对另一个问题的回答中进行了解释,但简而言之,dispatch_once()这是执行此操作的现代方式。它比 快@synchronized,并且具有更多的语义。

于 2013-02-14T21:53:53.653 回答
1

正如在例如http://cocoasamurai.blogspot.fi/2011/04/singletons-your-doing-them-wrong.html上所说,这个dispatch_once调用似乎比@synchronized(self).

至于为什么[super alloc]而不是[self alloc],我看不出它有什么理由专门适用于该dispatch_once版本而不适用于其他版本。在静态方法中,self仅引用类本身(super及其直接超类),我将其视为编写实际类名的简写,仅此而已。

不过我只用过[self alloc],因为无论如何我都写了当前类的名称,而不是它的超类。不知道具体调用是否[super alloc]具有任何特殊意义。

于 2013-02-14T21:55:02.023 回答
1

在类方法中,self指向类本身。在您的两个实现中[self alloc][MySingleton alloc][super alloc]在语义上都是等效的——除非您出于某种奇怪的原因 override +alloc

您可能希望[super alloc]在其他人身上使用的一个原因是当您+alloc使用编译器指令在声明中明确标记不可用时:

+(instancetype) alloc __attribute__((unavailable("alloc not available")));

或者

+(instancetype) alloc NS_UNAVAILABLE;

否则,当您尝试使用单例类的实例时,编译器将引发错误+alloc——这通常是您想要的,除非您+alloc在 dispatch_once 中共享单例实例。

于 2015-05-30T04:57:51.573 回答