Зачем устанавливать объект равным nil после отправки сообщения о выпуске в Obj-C - PullRequest
7 голосов
/ 18 июня 2010

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

[controller release], controller = nil;

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

Это просто "старая школа" способ делать вещи в Obj-C, или это нечто большее, чем я понимаю?

Ответы [ 4 ]

6 голосов
/ 18 июня 2010

Вызов release для объекта не обязательно означает, что он будет освобожден. Это просто уменьшает количество сохраняемых объектов. До тех пор, пока счетчик сохранений не достигнет 0, объект будет освобожден (и даже в этом случае объект может находиться в пуле автоматического выпуска и все равно не будет освобожден совсем).

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

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

2 голосов
/ 19 июня 2010

Две вещи

  • Как отметил jbrennan, аннулирование указателя объекта приведет к остановке сбоя вашей программы при использовании ранее dealloc объекта.
    Я думаю, что это плохо, так как вы, вероятно, таким образом запутываете ошибку или концептуальную слабость в коде.
    Если - с другой стороны - только что выпущенный вами объект выходит из области видимости или будет определенно иначебольше не будет использоваться - это назначение все равно будет отброшено компилятором во время оптимизации.
  • В среде с сборкой мусора отправка release объекту не оказывает никакого влияния .
    В зависимости от что вы делаете и где вы делаете это , установка указателя объекта на nil может иметь значение, будет ли GC получатьсяобъект или нет.
    Таким образом, без присваивания объект может жить и будет не только блокировать ресурсы, но, поскольку он полностью жив и действителен, может создавать ложную сторону-едефекты.
0 голосов
/ 18 июня 2010

В дополнение к другим ответам на многих языках принято устанавливать для освобожденных объектов значение nil, особенно когда объекты не являются полностью локальными (возможно, членами другого объекта).Это позволяет вам легко проверить и увидеть, был ли ранее выпущен объект, так что вы можете создать его снова, если это необходимо.

0 голосов
/ 18 июня 2010

Поскольку отправка сообщения объекту nil является допустимой операцией в Objective-C (ничего не происходит), установка указателя объекта на nil предотвращает возникновение плохих вещей, если объекту отправлено сообщение после его освобождения.*

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