Установить указатели на ноль после выпуска? - PullRequest
15 голосов
/ 14 сентября 2009

После освобождения объектов лучше всего установить указатели на ноль? Вот что я делал, просто хотел спросить, если это необходимо, хорошая практика или излишество?

- (void)dealloc{
    [planetName release]; // NSString instance variable
    [super dealloc];
}
@end

.

- (void)dealloc{
    [planetName release]; // NSString instance variable
    planetName = nil;
    [super dealloc];
}
@end

ура -gary-

Ответы [ 4 ]

20 голосов
/ 14 сентября 2009

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

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

6 голосов
/ 14 сентября 2009

Обычно при программировании на C / C ++ я устанавливаю его на нуль. Зачем? Потому что даже если вы освобождаете указанную память, указатель по-прежнему содержит адрес этой освобожденной памяти. Это может вызвать серьезные проблемы с нарушением прав доступа в коде, подобном следующему:

if(myPointer != null)
{
   doSomething(myPointer);
}

Если вы установили указатель на ноль, этого никогда не произойдет

1 голос
/ 14 сентября 2009

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

0 голосов
/ 02 марта 2012

Иногда это может быть решающим, как я только что узнал. Я использую камеру в своей игре, которая держит указатель на общую цель. Если вы вернетесь в главное меню с уровня, то он удалит уровень из памяти, но сохранит слои камеры и игры.

-(void) dealloc {
    [target release];
    target = nil;
    [super dealloc];
}

Поскольку камера будет существовать дольше, чем цель, лучше установить для цели значение nil, в противном случае, когда уровень снова загрузится и вы установите новую цель:

-(void) setTarget:(CCNode *)aTarget {
    [target release];
    target = [aTarget retain];
    [self update:0];
}

В этом выпуске произойдет сбой, если целью является мусор, а не ноль. Отправка сообщения на ноль - это нормально, но не в произвольную ненужную память. Это дает мне EXC_BAD_ACCESS.

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