Отправка сообщения на ноль действительна в Objective-C. Отправка сообщения освобожденному объекту не является.
Отправка сообщения на освобожденный объект:
id obj = [[MyClass alloc] init];
[obj release];
[obj doSomething]; // Crash!
Отправка сообщения на ноль:
id obj = [[MyClass alloc] init];
[obj release], obj = nil;
[obj doSomething]; // Valid
<ч />
Назначение nil переменной после освобождения объекта противоречиво, поскольку может помешать вам понять, что что-то не так. Пример Седаты Чужого:
[controlCenter dealloc];
...
float timeLeft = [controlCenter timeToWaitBeforeBombDetonation];
Этот код завершится сбоем после освобождения controlCenter. В результате этот дефект будет обнаружен и исправлен досрочно.
[controlCenter dealloc], controlCenter = nil;
...
float timeLeft = [controlCenter timeToWaitBeforeBombDetonation];
Этот код назначит 0.0 для timeLeft, который, по-видимому, является действительным временем ожидания, даже если controlCenter равен нулю.
<ч />
Примите вышеизложенное с небольшим количеством соли, поскольку, если вы пишете приложение Objective-C, вы, вероятно, больше заботитесь о том, чтобы ваши пользователи были довольны, избегая сбоев, чем разрушая города. Если последнее вызывает озабоченность, вам, вероятно, следует использовать язык, безопасный для типов, например Ada.