Почему я должен делать [освобождение объекта];объект = ноль;при освобождении объекта? - PullRequest
2 голосов
/ 15 сентября 2011

Я хотел бы понять, почему это может быть полезно (при условии, что «объект» был ранее выделен):

[object release]; 
object=nil;

Спасибо за помощь,

Stephane

Ответы [ 3 ]

5 голосов
/ 15 сентября 2011

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

Вот ответ, который утверждает это лучше: Установка указателей на ноль, target-c

1 голос
/ 15 сентября 2011

Если вы только что выпустили его, object все равно будет указывать на адрес памяти, который у него был раньше. Если вы проверили, что это ноль (object == nil), он вернет NO. Лучше убедиться, что он указывает на nil после того, как вы отпустите его.

1 голос
/ 15 сентября 2011

Это в основном связано с многопоточностью, если другой поток попытается получить доступ к объекту, который вы освободили, и установите nil, он не потерпит крах.Вы можете отправить сообщение объекту nil, и он просто ничего не будет делать.

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

Здесьхороший материал для чтения:

Если вы проголосовали против, скажите, пожалуйста, почему.

...