Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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