Влияние освобождения переменной больше, чем счет удержания - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть переменная экземпляра, объявленная как свойство сохранения, а затем я выпустил ее 2 раза. После выпуска я не использую это. Это не приводит к любой аварии. Есть ли другие последствия освобождения переменной больше, чем требуется (учитывая, что переменная не будет использоваться после выпуска):

@property (nonatomic, retain) NSString *myVariable;
self.myVariable = nil;
self.myVariable = nil;

Ответы [ 5 ]

4 голосов
/ 17 февраля 2012

На самом деле вы не выпускаете его дважды.Это потому, что вы используете свойства.При первом вызове self.myVariable = nil вы отпускаете его (при условии, что оно имеет значение).Но во второй раз, это уже ноль , поэтому освобождать нечего.

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

2 голосов
/ 17 февраля 2012

Вы на самом деле не выпускаете его дважды. Учитывая, что сеттер выглядит примерно так:

- (void)setMyVariable:(NSString)value
{
    [myVariable release];
    myVariable = [value retain];
}

Первый self.myVariable = nil выпустит myVariable iVar, а также установит для него ноль. Следующая self.myVariable = nil ничего не сделает, потому что [nil release] ничего не делает.

На самом деле чрезмерное высвобождение объекта вызовет (обычно) сбой.

1 голос
/ 17 февраля 2012

Вы можете быть смущены разницей между переменной и объектом.Одна переменная может использоваться с выпуском бесконечное количество раз (скажем, если это ноль, или она содержит совершенно другой сохраненный объект перед каждым выпуском и т. Д. Это происходит потому, что переменная не может содержать объект или разные объекты в разныхраз.).В вашем примере переменная не содержит ни одного объекта (nil) во время вашего второго выпуска.

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

0 голосов
/ 17 февраля 2012

С новым ARC (Автоматический подсчет ссылок) в iOS 5 вам не стоит беспокоиться об этой проблеме, так как об этом позаботится компилятор.

Подробнее об этом здесь: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

Однако, если вы не можете / не хотите использовать ARC, вот мой альтернативный ответ:

Получая доступ к вашим переменным, как вы делаете (self.var = nil), я предполагаю, чтоэти синтезированные функции позаботятся о том, чтобы не освобождать не сохраненную переменную, поэтому вы можете делать это столько раз, сколько захотите (хотя и не очень элегантно).

Если, с другой стороны, вы бы явноВыпустите как [var release] дважды или более, вы можете столкнуться с довольно неприятными проблемами.

0 голосов
/ 17 февраля 2012

Ничего не произойдет в вашем коде. Я предполагаю, что вы используете ARC (автоматический подсчет ссылок), поэтому вы «освобождаете» его, устанавливая указатель на ноль.

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

Итак, теперь ваш указатель указывает на этот объект, что делает дуга: если у объекта больше нет указателя, указывающего на него, то он автоматически освобождается. Предполагая, что у вас есть ТОЛЬКО тот «myvariable» указатель на эту NSString, он будет освобожден, как только вы установите его равным nil.

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

Обратите внимание, что это означает, что если у вас есть ДРУГАЯ переменная, также указывающая на эту NSString, то объект НЕ БУДЕТ освобожден, но моя переменная больше не будет указывать на него.

Я забыл упомянуть, вы можете найти отличное объяснение того, как работает arc в "iOS 5 by tutorials" Рэя Вендерлиха.

PD: если вы используете ARC, вы должны изменить

@ свойство (неатомное, сохранение) NSString * myVariable;

до

@ свойство (неатомное, сильное) NSString * myVariable;

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