Я вижу много кода Objective C, который имеет следующий синтаксис при попытке освободить объекты из памяти, когда они больше не необходимы.
[controller release], controller = nil;
Почему установленный переменная на ноль после отправки сообщения выпуска? Разве выпуск не собирается освобождать объект независимо от того, что? Почему это должно быть установлено на ноль также.
Это - просто "олдскульный" способ сделать вещи в Obj-C или там больше к нему, чем я понимаю?
Вызов release
для объекта не обязательно означает, что он будет освобожден. Он просто уменьшает счетчик удержания объекта. Только когда счетчик удержания достигнет 0, объект будет освобожден (и даже тогда объект может находиться в пуле автозапуска и все еще не быть освобожден).
Итак, вы можете отпустить свой объект, но вы все еще можете указывать на него. А потом он может быть выпущен автоматически. А затем вы отправляете ему сообщение - но, возможно, объект сейчас мусор. Плохо.
Установка вашего указателя на nil после его освобождения означает, что вы не можете отправить сообщение мусорному объекту. С этим предметом покончено, и вы можете говорить все, что хотите, до nil
, никакого вреда.
В дополнение к другим ответам во многих языках принято устанавливать для выпущенных объектов значение nil
, особенно когда объекты не являются полностью локальными (возможно, членами другого объекта). ). Это позволяет вам легко проверять и видеть, был ли объект ранее выпущен, чтобы вы могли создать его снова при необходимости.
Две вещи
освобожденного
объекта. релиза
объекту не имеет никакого эффекта . Поскольку отправка сообщения объекту nil является допустимой операцией в Objective-C (ничего не происходит), установка указателя объекта на nil предотвращает возникновение плохих вещей, если объект отправляет сообщение после того, как он был выпущен.