2009-05-21 4 views
5

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

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

У меня есть один определить, как это:

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; 

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

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

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

ответ

8

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

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

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

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

+0

не могли бы вы взглянуть на это, я думаю, вы можете мне помочь http://stackoverflow.com/questions/6928028/objective-c-alloc-release-error-in-singleton-class – Spring

2

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

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

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

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