релиз против нуля - Лучшая практика - PullRequest
7 голосов
/ 19 ноября 2010

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

1 Ответ

11 голосов
/ 19 ноября 2010

Лучшая практика:

[foo release]; // ensures that memory is released
foo = nil; // ensures that there is no dangling pointer to released memory

Другие примечания:

Когда вы присваиваете свойство, объявленное для сохранения,

// in your .h
@property (retain) MyObject *foo;

// in your .m
self.foo = bar; // bar is retained; whatever foo previously pointed at is released

он высвободит то, на что ранее указывал, и сохранит назначаемый новый объект.

Итак, вы можете использовать:

self.foo = nil;

, и он освободит все, на что указывал foo. Однако, , если ваше свойство не было объявлено сохраняющим семантику хранилища, это не будет неявно освобождать то, на что указывает foo.Кроме того, как указал Райан, свойство может быть переопределено, чтобы иметь побочные эффекты.По этой причине лучше всего следовать шаблону всегда использования:

[foo release];

Чтобы убедиться, что у вас нет висящего указателя на освобожденную память, вы можете выполнить следующее:

foo = nil;

Если вы не используете свойства с сохранением семантики, вам необходимо для освобождения того, что было сохранено в переменной:

[foo release];

РЕДАКТИРОВАТЬ: Также см. Следующий ответ на другой вопрос, объясняющий это:

iPhone - dealloc - Релиз против nil

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