Да Да, да. Вы почти всегда должны установить его равным нулю после выпуска, именно по той причине, которую вы упомянули. Вам не нужно, если вы никогда не получите к нему доступ снова (как в dealloc) или если вы сразу же установите его на что-то другое.
Это очень полезно, потому что в Obj-C есть функция «nil messaging»: если вы отправляете сообщение nil, оно не вылетает, оно просто ничего не делает. Итак:
MyClass *obj = [[MyClass alloc] init];
[obj doSomething]; // this works
[obj release]; // obj is now invalid
[obj doSomething]; // and this would crash
// but...
MyClass *obj = [[MyClass alloc] init];
[obj doSomething]; // this works
[obj release]; // obj is now invalid
obj = nil; // clear out the pointer
[obj doSomething]; // this is a no-op, doesn't crash
Другой пример, основанный на вашем комментарии:
// we have an object
MyObject *obj = [[MyObject alloc] init];
// some other object retains a reference:
MyObject *ref1 = [obj retain];
// so does another:
MyObject *ref2 = [obj retain];
// we don't need the original reference anymore:
[obj release];
obj = nil;
[ref1 doSomething]; // this works
// now we're done with it
[ref1 release];
ref1 = nil;
// but someone else might still want it:
[ref2 doSomething]; // this works too!
[ref2 release];
ref2 = nil; // all cleaned up!
Прочтите Рекомендации по управлению памятью !