Вам нужно сделать шаг назад и подумать, сколько разных вещей нужно, чтобы получить доступ к указанному объекту.
Если это все, то вам, вероятно, следует реализовать шаблон общего экземпляра. Что-то вроде:
+ (MyObject *) mySharedObjectThatEveryoneUses
{
static MyObject *sharedInstance;
if (!sharedInstance) {
sharedInstance = [MyObject alloc];
sharedInstance = [sharedInstance init];
}
return sharedInstance;
}
Обратите внимание, что приведенное выше не учитывает многопоточность при инициализации. То есть если несколько потоков одновременно вызывают метод в первый раз, вы можете получить несколько экземпляров. Также обратите внимание, что разделение +alloc
и -init
является шаблоном, уникальным для этой ситуации. Это позволяет избежать ситуации, когда метод -init
вызывает вызов + mySharedObjectThatEveryoneUses
, создавая второй экземпляр до того, как может произойти назначение.
Теперь, если вы говорите о доступе в графе объектов; доступ к единственному экземпляру в некотором подмножестве объектов в вашем приложении, тогда вам потребуется где-то переменная экземпляра, к которой могут добраться все объекты.
Например, скажем, вы реализуете игру, в которой есть объект Player, а этот объект Player имеет несколько экземпляров Piece. При создании фигуры у вас обычно будет свойство, которое относится к игроку-владельцу, и это будет ваша единственная точка отсчета.
Если вам нужно что-то более скоротечное, вам, скорее всего, стоит посмотреть, каким должен быть уровень вашего контроллера. То есть где-то должен быть какой-то объект, который может выступать в качестве координатора для набора объектов, которым необходим доступ к этому единственному экземпляру.