我阅读了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
答案 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]可以返回另一个对象。在这种情况下,“如果返回的对象发生更改,则继续对其进行初始化是一个错误”