Выпуск синглетонов на Objective-C

Я новичок в программировании на Objective-C, и выпуск объектов — моя самая большая головная боль. Я всегда сомневаюсь в том, что нужно выпустить, и иногда я выпускаю неправильную переменную и получаю сбой BAD EXEC. Я читал руководство Apple по управлению памятью, но не всегда могу перейти от их примеров к своему коду.

Одна из таких ситуаций — мои синглтоны (я большой парень-одиночка).

У меня есть одно определение:

static Configuration* _instance;

+(Configuration*)getInstance{
    if (_instance == NULL){
        _instance = [Configuration alloc];
        [_instance initConfig];
    }
    return _instance;
}

В моем коде я использую это так:

//Store configuration       
Configuration* conf = [Configuration getInstance];  
conf.userName = self.userName.text;
conf.cellPhone = self.phoneNumber.text;

Нужно ли освобождать переменную «conf»?

Когда я должен освободить _instance?

Поскольку я запускаю этот код на iPhone, что происходит с переменными, которые я не выпускаю? повлияют ли они на производительность iPhone?


person gonso    schedule 21.05.2009    source источник


Ответы (2)


Когда вы создали экземпляр конфигурации с помощью "_instance = [Распределение конфигурации]; [_instance initConfig];" у него был счетчик сохранения, равный единице, из вызова alloc. Если вы должны были освободить conf после "conf.cellPhone = self.phoneNumber.text;" тогда он будет освобожден в этот момент.

Когда вы впервые создаете объект с помощью alloc, copy или mutableCopy, он будет иметь счетчик сохранения, равный 1. Каждый вызов сохранения увеличивает этот счетчик на единицу. Каждый призыв к выпуску уменьшает количество сохранений на 1. Вызов автовыпуска просто означает «Вызовите выпуск для меня позже», поэтому, если удержания и выпуски подобны чекам, автовыпуск подобен будущему датированию чека.

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

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

person Jon Hess    schedule 22.05.2009
comment
не могли бы вы взглянуть на это, я думаю, вы можете мне помочь stackoverflow.com/questions/6928028/ - person Spring; 03.08.2011

Вам не нужно освобождать переменную conf, поскольку вы ее не сохранили.

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

init, retain увеличивают его, а release уменьшают.

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

person pgb    schedule 22.05.2009