objective-C Разница между установкой нуля и выпуском

Я узнал, что в dealloc вы [object release]; но в viewDidUnload (в подclassе UIViewController) вы делаете self.object = nil . На самом деле разница заключается в том, что self.object = nil (мы предполагаем, что объект является (nonatomic, retain) свойством) сохраняет nil (что ничего не делает), а затем высвобождает старое значение, а затем счетчик ссылок равен 0 правильно?

self.object = nil вызывает ваш сеттер, который self.object = nil старое значение, устанавливает член в nil и, возможно, выполняет другие действия (это метод, поэтому он может что-то делать). «Любая» часть этого потенциально опасна; см. этот вопрос , например.

[object release] высвобождает старое значение, но оставляет его в качестве текущего висячего указателя, который является хорошим рецептом ошибок. В dealloc это не имеет большого значения, так как сам указатель тоже уходит, но в любом другом случае очень сложно выпустить элемент, не устанавливая его на nil .

(Как побочный элемент, вы никогда не должны предполагать, что освобождение объекта дает ему счетчик ссылок 0. Он освобождает вашу ссылку, но другие объекты могут по-прежнему ссылаться на нее.)

Если вы выполняете object = nil без [object release] , это может привести к утечке памяти. Если вы выполняете [object release] без object = nil , объект становится висящим указателем, как предлагал @Jim. self.object = nil – это сахар для вызова функции setter.

Если вы выполняете [выпуск объекта] и хотите получить доступ к объекту, приложение просто сбой. Если вы делаете object = nil и хотите получить доступ к объекту, ничего не выйдет.

Причина в [выпуске объекта], вы пытаетесь освободить объект. поэтому у него нет указателя (нет заметки). В object = nil, вы пытаетесь присвоить объект нулевым указателем. поэтому, если вы пытаетесь получить доступ к объекту, ничего не произойдет.

Как правило, мы написали код как [ object release]; object = nil; object release]; object = nil; потому что, если вы случайно получите доступ к объекту, приложение не будет разбито.

Если вы просто освободите объект, он станет свободным объектом.

И если вы попытаетесь выполнить какую-либо операцию над свободным объектом, ваше приложение выйдет из строя. Чтобы избежать таких аварий, всегда предпочтительнее «назначить свой объект на нуль после его выпуска». Потому что все мы знаем, что любые операции, выполненные на nil, не будут выполнены 🙂

  • Загрузить файл свойств в JAR?
  • `def` vs` val` vs `lazy val` в Scala
  • Перечисление через свойства объекта (строка) в C #
  • Доступ к файлам свойств программно с помощью Spring?
  • Где разместить и как читать файлы ресурсов конфигурации в приложении на основе сервлета?
  • Объект C - свойство Synthesize
  • Общаться между двумя windowsми в C #
  • Json.NET (Newtonsoft.Json) - Два «свойства» с таким же именем?
  • Как избежать знака равенства в файлах свойств
  • Аннотирование Spring @Value в classе @Controller, не оценивающая значение внутри файла свойств
  • Когда я должен использовать @synthesize явно?
  • Давайте будем гением компьютера.