Почему установленный объект к нолю после передающего сообщения выпуска в Obj-C

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

[controller release], controller = nil;

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

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

7
задан cpjolicoeur 18 June 2010 в 17:54
поделиться

4 ответа

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

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

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

6
ответ дан 7 December 2019 в 05:18
поделиться

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

0
ответ дан 7 December 2019 в 05:18
поделиться

Две вещи

  • Как заметил jbrennan, обнуление указателя объекта остановит вашу программу от сбоя при использовании ранее освобожденного объекта.
    Я думаю, что это плохо, так как вы, вероятно, таким образом запутываете ошибку или концептуальную слабость в коде.
    Если, с другой стороны, объект, который вы только что выпустили, выходит за пределы области видимости или в противном случае определенно не будет использоваться снова, это назначение будет удалено компилятором во время оптимизации в любом случае.
  • В среде со сборкой мусора отправка релиза объекту не имеет никакого эффекта .
    В зависимости от того, что вы делаете, и , где вы это делаете, установка указателя объекта на ноль может иметь значение, будет ли сборщик мусора пожать объект или нет. .
    Таким образом, без присвоения объект может жить и не только блокировать ресурсы, но, поскольку он полностью активен и действителен, может вызывать ложные побочные эффекты.
2
ответ дан 7 December 2019 в 05:18
поделиться

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

0
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

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