Objective-C Разница между установкой нуля и выпуском - PullRequest
28 голосов
/ 31 июля 2009

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

Ответы [ 4 ]

54 голосов
/ 31 июля 2009

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

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

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

5 голосов
/ 22 июня 2012

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

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

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

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

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

1 голос
/ 10 мая 2011

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

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

...