Установить указатели на нуль после выпуска?
После выделения объектов лучше всего установить указатели на нуль? Это то, что я делал, просто хотел спросить, нужна ли его необходимая, хорошая практика или перебор?
- (void)dealloc{
[planetName release]; // NSString instance variable
[super dealloc];
}
@end
.
- (void)dealloc{
[planetName release]; // NSString instance variable
planetName = nil;
[super dealloc];
}
@end
cheers -gary -
Ответы
Ответ 1
Зависит от области действия переменной, содержащей указатель. Я всегда устанавливаю указатели на нуль, если они продолжают существовать в пределах области действия, на всякий случай, когда я снова вызываю переменную где-то еще. В противном случае существует риск того, что я получу доступ к ячейке памяти, содержащей объект, который теперь выпущен.
Но если переменная выходит за пределы области видимости, то она также не будет использоваться, поэтому присвоение ей nil немного переборщит. Тем не менее, это хорошая практика, чтобы просто назначить nil на случай, если кто-то решит добавить код в ваш код и случайно использует переменную снова в своей области, но после ее освобождения.
Ответ 2
Обычно при программировании на C/С++ я устанавливаю его на null. Зачем? Потому что, даже если вы освобождаете указательную память, указатель по-прежнему сохраняет адрес освобожденной памяти. Это может вызвать серьезные проблемы с нарушением прав доступа в коде:
if(myPointer != null)
{
doSomething(myPointer);
}
Если вы указали свой указатель на нуль, это никогда не произойдет
Ответ 3
Он считал хорошую практику. Если вы установите указатели на нуль после их освобождения, тогда, если вы неправильно используете свою переменную на более поздней стадии выполнения, вы получите правильную ошибку.
Ответ 4
Иногда это может иметь решающее значение, как я только что узнал. Я использую камеру в своей игре, которая удерживает указатель на общую цель. Если вы вернетесь в главное меню с уровня, то он очистит уровень от памяти, но сохранит уровень камеры и игры.
-(void) dealloc {
[target release];
target = nil;
[super dealloc];
}
Поскольку камера будет существовать дольше, чем цель, лучше установить цель на нуль, иначе, когда уровень загрузится снова, и вы установите новую цель:
-(void) setTarget:(CCNode *)aTarget {
[target release];
target = [aTarget retain];
[self update:0];
}
Это сбой на этом выпуске, если цель - это хлам, а не ноль. Отправка сообщения в нуль прекрасна, но не в какую-либо произвольную память. Это дает мне EXC_BAD_ACCESS
.