为什么self = [super init]确保单例模式?

时间:2018-07-23 22:00:57

标签: objective-c design-patterns singleton

我阅读了Objective-C中许多单例模式的实现,并且许多代码在init方法中包含这样的行:

if ((self = [super init])) {
   ...
}

根据此页面,有关[super init]的许多问题都引用了该页面:https://www.cocoawithlove.com/2009/04/what-does-it-mean-when-you-assign-super.html

self = [super init]“总是返回单例,而不是任何后续分配”。

但是为什么呢?以下是我对共享单例的实现

#pragma mark -
#pragma mark Constructors

+ (VoiceProfileManager*)sharedManager {
    static VoiceProfileManager *sharedManager = nil;
    //Executes a block object once and only once for the lifetime of an application.
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        sharedManager = [[VoiceProfileManager alloc] init];
    });
    return sharedManager;
}

- (id)init {
    if ((self = [super init])) {
    }
    return self;
}

@end

2 个答案:

答案 0 :(得分:1)

不是''方法,而是使用init函数来构建单例实例。

dispatch_once

第一行初始化名为static dispatch_once_t once; dispatch_once(&once, ^{ // every code here will be executed only once! }); 的全局静态变量,在once函数执行一次后,它具有恒定值。

您可以假定dispatch_once值有一个全局变量池,当它第二次执行时,它检查once值是否存在于池中,并在以下情况下跳过块执行是的。

那么为什么第一行只初始化once变量一次?用C语言检查once关键字。

祝你好运!

答案 1 :(得分:0)

您引用的外部页面显示[super init](而不是您的问题中的self = [super init])“总是返回单例而不是任何后续分配”

因此,[super init]可以返回另一个对象。在这种情况下,“如果返回的对象发生更改,则继续对其进行初始化是一个错误”