Я считаю синглеты плохой идеей, и это выглядит примерно в четыре раза ужаснее. Код довольно сложный, вы можете быть уверены, что потратите немало часов на то, чтобы отследить тонкие ошибки в нем, и вы, вероятно, никогда не будете чувствовать себя комфортно. Это не хорошо. Вы должны выбросить эту мерзость и соединить свои объекты другим способом, который не требует большого количества размышлений.
Если вам нравятся шаблоны, вы можете использовать что-то похожее на шаблон Factory, чтобы связать ваши объекты. Фабрика позаботится о создании этих двух экземпляров и передаче их по мере необходимости. И Фабрика будет намного проще, чем Multiton:
@interface Factory : NSObject {
Foo *foo1, *foo2;
}
@end
@implementation Factory
- (id) init {
[super init];
foo1 = [[Foo alloc] init];
foo2 = [[Foo alloc] init];
return self;
}
Конечно, вам не нужно создавать оба экземпляра одновременно. Там вы можете делать все что угодно - кеш, ленивая загрузка, все что угодно. Дело в том, чтобы управление жизненным циклом Foo
оставлялось на заводе отдельно от кода Foo
. Тогда это становится намного легче. ¶ Все остальные объекты, которым требуется Foo
, будут созданы и подключены через Factory и получат свои Foo
через установщик:
@implementation Factory
- (id) wireSomeClass {
id instance = [[SomeClass alloc] init];
[instance setFoo:foo1];
[instance setAnotherDependency:bar];
return [instance autorelease];
}
Это гораздо проще, чем код из вашего вопроса.