Это можно сделать.Об этом есть раздел в Какао-шаблонах Бака и Яхтмана.
В вашем случае вы можете сделать что-то вроде:
static Universe *instance;
+ (Universe *)instance { return instance; }
+ (id)hiddenAlloc
{
return [super alloc];
}
+ (id)alloc
{
return [[self instance] retain];
}
+ (void)initialize
{
static BOOL initialized = NO;
if(!initialized)
{
initialized = YES;
instance = [[Universe hiddenAlloc] init];
}
}
- (id)init
{
if(instance==nil) // allow only to be called once
{
// your normal initialization here
}
return self;
}
Перозагрузка кода тогда правильно подберет синглтон через его вызов к [[Universe alloc] init]
, и вы все равно можете использовать instance
в своем коде, как и раньше.
Книга содержит больше деталей и рекомендует реализовать new
и allocWithZone
(оба просто как return [self alloc];
), а также заглушки для отчетов об ошибках, чтобы поймать copyWithZone
и mutableCopyWithZone
попытки для хорошей меры.