Есть ли способ создать шаблон Singleton с помощью target-c, который позволил бы клиентскому коду получить общий экземпляр любого из его подклассов?
Я пытался:
@interface Base : NSObject {}
+(id)instance;
@end
@implementation Base
static id _instance;
+(id)instance {
if (!_instance) {
_instance = [[self alloc] init];
}
return _instance;
}
@end
Но вызов [AmazingThing instance]
любого подкласса возвращает только первый экземпляр, созданный с помощью этого механизма, независимо от типа _instance
.Есть ли обходные пути?
Редактировать
Я понял (отвечая на удаленный ответ), что могу сделать то, что искал, изменив реализацию на:
static NSMutableDictionary *_instances;
+(id)instance {
if (!_instances) {
_instances = [[NSMutableDictionary alloc] init];
}
id instance = [_instances objectForKey:self];
if (!instance) {
instance = [[self alloc] init];
[_instances setObject:instance forKey:self];
}
return instance;
}
Теперь работает как положено.Тем не менее, мне интересно узнать, есть ли лучший способ сделать это.