Я видел, как это делалось двумя способами.
- Брось исключение внутри
init
.
- Пусть объект, возвращаемый init, будет вашим одноэлементным объектом.
Просто чтобы прояснить, не делайте этого. Это не нужно и сделает ваши синглеты слишком сложными для тестирования и подкласса.
изменить, чтобы добавить примеры
Бросить исключение в init
- (instancetype)init {
[self doesNotRecognizeSelector:_cmd];
return nil;
}
- (instancetype)initPrivate {
self = [super init];
if (self) {
}
return self;
}
+ (instancetype)sharedInstance {
static MySingleton *sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] initPrivate];
});
return sharedInstance;
}
Пусть init вернет ваш синглтон
- (instancetype)init {
return [[self class] sharedInstance];
}
- (instancetype)initPrivate {
self = [super init];
if (self) {
}
return self;
}
+ (instancetype)sharedInstance {
static MySingleton2 *sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] initPrivate];
});
return sharedInstance;
}