Objective-C выпуск синглетонов - PullRequest
5 голосов
/ 22 мая 2009

Я довольно новичок в объектно-ориентированном программировании, и освобождение объектов - моя самая большая головная боль. Я всегда сомневаюсь в том, что нужно выпустить, и в свое время я выпускаю неправильную переменную и получаю ошибку 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?

Ответы [ 2 ]

8 голосов
/ 22 мая 2009

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

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

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

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

2 голосов
/ 22 мая 2009

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

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

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

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

...