Управление памятью Objective-C: когда вы используете `[variable release]` vs `variable = nil` для очистки памяти? - PullRequest
1 голос
/ 17 июля 2010

У меня есть люди, которые используют [variable release], а иногда и variable = nil для очистки памяти?

Когда вы используете каждый? а в чем отличия?

Ответы [ 3 ]

5 голосов
/ 17 июля 2010

variable = nil; не освободит память.self.property = nil; освободит память, если [self setProperty:nil];, например, синтезированное свойство с атрибутом retain.Вызов [variable release]; всегда освобождает одну ссылку на объект.

2 голосов
/ 17 июля 2010

Зависит от того, что вы подразумеваете под «очисткой памяти».

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

Установка переменной на nil не обязательно освобождает память (см. Ответ drawedward) и может быть источником утечек памяти.

Когда вы видите переменную, установленную на nil, речь идет о предотвращении ее случайного использования позже после освобождения памяти (это может привести к сбоям). Хотя вы всегда можете установить переменную на nil после вызова на release, это действительно вопрос стиля, когда это действительно необходимо. Например, вы не часто видите переменные, установленные на nil в методе dealloc класса, поскольку к этому моменту объект больше не сможет случайно использовать такую ​​переменную случайно, так как он обнуляется. 1018 *

0 голосов
/ 17 июля 2010

Если для свойства установлено значение retain, то эти 3 эквивалентны:

  1. [self setProperty:nil];
  2. self.property = nil;
  3. [property release]; property = nil;

В каждом случае объект будет освобожден, а затем будет установлен на ноль, так что весь доступ к объекту с этого момента будет запрещен.«обнуление» переменной экземпляра удобно, так как она гарантирует, что вы можете когда-либо освобождать объект только один раз в этом контексте, потому что двойной вызов self.property = nil ничего не изменит во второй раз, но вызов [property release] дважды освободит объект, даже если вы, вероятно, толькосохраните его один раз.

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

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