iPhone - dealloc - релиз против ноля

Обратите внимание, что если вы используете виртуальную среду (как в режиме совместного хостинга), вы должны настроить свой путь на python, например: /home/user/mypython/bin/python ./cgi-bin/test.py

24
задан Srikar Appalaraju 24 September 2011 в 08:18
поделиться

5 ответов

Вероятно, вы видели следующее:

1) [foo release];
2) self.bar = nil;
3) baz = nil;
  1. Освобождает объект, обращаясь к нему через переменную экземпляра foo . Переменная экземпляра станет висящим указателем. Это предпочтительный метод в dealloc.

  2. Назначение nil свойству bar на self, что на практике освобождает все, что свойство в настоящее время сохраняет. Сделайте это, если у вас есть настраиваемый установщик для свойства, который должен очищать не только переменную экземпляра, поддерживающую свойство.

  3. Заменяет указатель baz , ссылающийся на объект, с помощью nil, но не освобождает предмет. Результат - утечка памяти. Никогда не делайте этого.

36
ответ дан 28 November 2019 в 23:21
поделиться

Если вы не используете свойства (где self.property = nil также освобождает объект), вам ВСЕГДА следует выполнять выпуск по коду, который устанавливает ссылку на nil, как вы отметили:

[view release]; view = nil;

Причина в том, что он исключает возможность использования недействительной ссылки. Это редко и сложно, но может произойти.

8
ответ дан 28 November 2019 в 23:21
поделиться

Что касается использования внутри вашего кода, в вашем dealloc присвоение свойству не требуется, все, что вам нужно сделать - это releaseas ing.

- (void)dealloc {
    [myProperty release]; // don't need to assign since you won't have the object soon anyway
    [super dealloc];
}
1
ответ дан 28 November 2019 в 23:21
поделиться

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

С nil вы гарантируете, что программа не выйдет из строя, поскольку отправка сообщения на nil приводит к ничего такого.

0
ответ дан 28 November 2019 в 23:21
поделиться

@ bbullis22, вы видели, что счетчик восстановления упал с 3 до 0, потому что вы установили ссылку на ноль. затем вы запросили оставшееся значение «ноль», которое равно нулю. однако объект, на который раньше ссылались, имеет тот же счетчик сохранения - 1 (из-за установки ссылки на nil). при использовании release ссылка по-прежнему ссылается на тот же объект, поэтому вы видите счетчик сохранения понизьте с 3 до 2 в этой ситуации.

2
ответ дан 28 November 2019 в 23:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: