Лучшая практика:
[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