iPhone – dealloc – Релиз против нуля

Удивление, если кто-то с опытом может объяснить это немного больше. Я видел примеры …

[view release]; view = nil; 

…. внутри (void) dealloc.

В чем разница и лучше ли другое? Каков наилучший способ?

Когда вы проводите тестирование keepCount, я лично видел, что nil меняет счет от 3 до 0, но релиз только снижает его с 3 до 2.

    То, что вы видели, вероятно, таково:

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

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

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

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

     [view release]; view = nil; 

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

    Это еще более важно в viewDidUnload, если вы освобождаете IBOutlets – это более реалистичный сценарий, когда ссылка может испортиться из-за того, что предупреждения о памяти выгружают представление, а затем некоторый другой код в представлении, пытающийся использовать ссылку перед просмотр перезагружается.

    В принципе, это просто хорошая практика, и в какой-то момент это спасет вас, если вы сделаете это привычкой.

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

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

     - (void)dealloc { [myProperty release]; // don't need to assign since you won't have the object soon anyway [super dealloc]; } 

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

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

    Interesting Posts

    Java: значение parse int из char

    Как я могу диагностировать неспособность достичь определенного веб-сайта в качестве конечного пользователя?

    Найти неизвестную статическую маску подсети IP + для устройства?

    У меня есть 4 порта Ethernet RJ45, которые были ограничены до 200 КБ в секунду. Как использовать все 4 порта для ускорения моего сетевого подключения?

    Как отправить SMS с моего ПК с помощью моего телефона Android (Galaxy S3)

    Строки таблицы Angular2 как компонент

    android: определение уровня звука

    Как изменить десятичный разделитель DecimalFormat от запятой до точки / точки?

    Git для локального развития

    В VBScript мне нужен код для вычитания 1 из searchResult.Updates.Count, так что Count = 0 и WScript.Quit будут выполняться соответственно

    Как предотвратить внедрение XPath / XML в .NET.

    Параллель.For (): обновить переменную вне цикла

    Лучший метод синхронизации в C?

    Можете ли вы изменить templateUrl на лету?

    Что более эффективно: несколько таблиц MySQL или одна большая таблица?

    Давайте будем гением компьютера.