Я хотел бы взять НОД подход с использованием общих экземпляров к следующему шагу, так что я создал следующий код:Безопасный способ создать синглтон с методом инициализации в Objective-C
@implementation MyClass
static id sharedInstance;
#pragma mark Initialization
+ (instancetype)sharedInstance {
static dispatch_once_t once;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (instancetype)init {
if (sharedInstance) {
return sharedInstance;
}
@synchronized(self) {
self = [super init];
if (self) {
sharedInstance = self;
}
return self;
}
}
@end
Я предполагаю, что метод sharedInstance
Кажется, все в порядке, но я не уверен в методе init. Причина этого заключается в том, что я не хочу, чтобы люди использовали мой SDK, чтобы использовать метод init, и если они это сделают ... сделайте это пуленепробиваемым.
(self = [super init]) выдает предупреждение и инициализирует без возврата. Nil остановит xcode от компиляции ... это было в моем edit – Ondrej
@Ondrej. Отсутствующий возврат можно легко «зафиксировать» с помощью '@ throw' вместо '[NSException raise:]'. И '' (self = [super init]) 'pattern не создает предупреждения, вы должны что-то еще испортить. – Leo
Почему бы не использовать '+ initialize' для инициализации экземпляра singleton? – Hyperbole