Как определить, был ли объект уже выделен, чтобы он не выделялся несколько раз? - PullRequest
2 голосов
/ 17 января 2010

Пожалуйста, будь милым .. Я новичок в этом деле. Я хочу выделить и использовать объект через метод, который я вызываю много раз, и вместо того, чтобы сделать его глобальной переменной и выделить его в моем методе initWithFrame, я хочу выделить его только в одном методе и сделать его локальной переменной Я выделяю тогда и использую потом.

Ответы [ 4 ]

6 голосов
/ 17 января 2010

Вам нужно сделать шаг назад и подумать, сколько разных вещей нужно, чтобы получить доступ к указанному объекту.

Если это все, то вам, вероятно, следует реализовать шаблон общего экземпляра. Что-то вроде:

+ (MyObject *) mySharedObjectThatEveryoneUses
{
    static MyObject *sharedInstance;
    if (!sharedInstance) {
        sharedInstance = [MyObject alloc];
        sharedInstance = [sharedInstance init];
    }
    return sharedInstance;
}

Обратите внимание, что приведенное выше не учитывает многопоточность при инициализации. То есть если несколько потоков одновременно вызывают метод в первый раз, вы можете получить несколько экземпляров. Также обратите внимание, что разделение +alloc и -init является шаблоном, уникальным для этой ситуации. Это позволяет избежать ситуации, когда метод -init вызывает вызов + mySharedObjectThatEveryoneUses, создавая второй экземпляр до того, как может произойти назначение.

Теперь, если вы говорите о доступе в графе объектов; доступ к единственному экземпляру в некотором подмножестве объектов в вашем приложении, тогда вам потребуется где-то переменная экземпляра, к которой могут добраться все объекты.

Например, скажем, вы реализуете игру, в которой есть объект Player, а этот объект Player имеет несколько экземпляров Piece. При создании фигуры у вас обычно будет свойство, которое относится к игроку-владельцу, и это будет ваша единственная точка отсчета.

Если вам нужно что-то более скоротечное, вам, скорее всего, стоит посмотреть, каким должен быть уровень вашего контроллера. То есть где-то должен быть какой-то объект, который может выступать в качестве координатора для набора объектов, которым необходим доступ к этому единственному экземпляру.

1 голос
/ 17 января 2010

То, что вы хотите, называется синглтоном. Вы можете прочитать о рекомендованном Apple способе создания синглетонов здесь:

http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32

Найдите «Создание экземпляра синглтона» в разделе «Объекты какао». Есть еще несколько методов, которые хорошо определить помимо инициализатора уровня класса.

1 голос
/ 17 января 2010

Если я правильно понял ваш вопрос, вы ищете переменную static. Статическая переменная сохраняет свое значение как глобальная переменная, но она «живет» внутри функции как локальная переменная. Ваша функция может выглядеть примерно так:

+ (MyObject *)getSingletonObject {
   static MyObject *obj = [[MyObject alloc] init];
   return obj;
}

obj будет создан при первом вызове этого метода, но повторный вызов метода вернет тот же объект, который он уже создал.

0 голосов
/ 17 января 2010

Я не совсем уверен, что понимаю ваш вопрос, но вы не можете выделить один и тот же объект много раз.

Каждый раз, когда вы хотите новый экземпляр, вы просите объект Class выделить для вас новый экземпляр (да, сами классы являются объектами, которые просто поражают воображение). Итак, этот код:

NSString* s;
s = [[NSString alloc] init];
s = [[NSString alloc] init];

Здесь вы создаете два экземпляра NSString. Этот код плох, потому что мы выделили первый экземпляр и не выпустили, и присвоили его единственную ссылку (и) новому экземпляру. Это может привести к утечке памяти.

...