Как отметил Эндрю, есть случаи, когда назначение nil
не только позволяет избежать ошибок, но и необходимо. Просто рассмотрим типичный UIViewController
код
- (void)viewDidLoad {
button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // autoreleased
[button retain]; // keep alive
}
- (void)viewDidUnload { // view has been removed
[button release];
}
- (void)dealloc { // destroying the view controller
[button release]; // <-- problem
}
В случае, если контроллер загружен, позже выгружен (поскольку на другом контроллере представления отображается память, которой не хватает памяти) и, наконец, уничтожен, [button release]
в dealloc
приведет к чрезмерному отпусканию кнопки (отправит сообщение освобожденному объект). Поэтому необходимо назначить ноль. Безопасное решение будет:
- (void)viewDidUnload { // view has been removed
[button release];
button = nil;
}
- (void)dealloc { // destroying the view controller
[button release]; // <-- safe
}
Для этих случаев макрос полезен и полезен. Чтобы быть более точным в том, что он делает, лучше назовите его RELEASE_AND_NIL
#define RELEASE_AND_NIL(X) [X release]; X = nil;