Да. Функция не будет делать то, что вы ожидаете, потому что указатель будет передан в нее по значению, а не по ссылке.
Представьте себе это:
- (void)method {
id object = [[NSObject alloc] init];
SAFELY_RELEASE( object );
}
SAFELY_RELEASE получает object
. Он может отправлять ему сообщения, но установка его на ноль не изменит его значение в method
.
Эквивалентная функция будет:
void SAFELY_RELEASE(id *__POINTER) {
[*__POINTER release]; *__POINTER = nil;
}
Тогда вы бы использовали его, используя:
SAFELY_RELEASE( &object );
Макрос имеет и другой недостаток: инструменты рефакторинга XCode , вероятно, не смогут изменить параметр внутри. Например:
@interface Foo {
NSObject *var;
}
@implementation Foo
- (id)init {
if (( self = [super init] )) {
var = [[NSObject alloc] init];
}
return self;
}
- (void)dealloc {
SAFELY_RELEASE(var);
[super dealloc];
}
Если вы попытаетесь переименовать var с помощью инструмента рефакторинга, вы, вероятно, обнаружите, что он не сможет переименовать переменную в dealloc.
Действительно, если у вас нет веских причин для этого, вы должны использовать ARC.