Нужно ли «сохранять» при сохранении существующего объекта в переменной экземпляра контроллера? - PullRequest
1 голос
/ 22 мая 2011

Я довольно плохо знаком с Objective-C и пытаюсь разобраться со сложным миром или управлением памятью.

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

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

My view controller .h file:

@interface MyViewController : UIViewController {

    MyGlobalObjectType *_myobject;
}

@end

Это мой метод инициализации моего файла контроллера .m файла:

-(id)initWithCoder:(NSCoder *)aDecoder
{
    if ((self = [super initWithCoder:aDecoder])) {        
        _myobject = [[Global sharedGlobal] myobject];
    }
    return self;    
}

У меня вопрос: когда я сохраняю ссылку (указатель) на другую переменную, должен ли я вызывать retain для нее при инициализации этой переменной экземпляра?

Ответы [ 2 ]

0 голосов
/ 22 мая 2011

Зачем вам нужна ссылка на ваш синглтон? Это побеждает цель создания одного в первую очередь. Просто получите ссылку на синглтон в тот момент, когда он вам нужен.

0 голосов
/ 22 мая 2011

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

В этом случае, когда ваш объект (внутри синглтона) инициализируется, он имеет счетчик ссылок +1. Если бы вы вызвали retain для этого объекта, его счетчик ссылок увеличился бы до +2. Это совершенно нормально, если вы не забудете вызвать на нем release, когда ваш контроллер представления покончит с ним, и его счет уменьшится до +1. Тем не менее, вам обычно не нужно этого делать.

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

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