SAFELY_RELEASE в ViewDidUnLoad - PullRequest
       1

SAFELY_RELEASE в ViewDidUnLoad

0 голосов
/ 16 марта 2012

Есть ли разница между этими двумя методами?

`` `

// MACRO FUNCTION

#define SAFELY_RELEASE(__POINTER) { [__POINTER release]; __POINTER = nil; }

// C FUNCTION

void SAFELY_RELEASE(id __POINTER) {
    [__POINTER release]; __POINTER = nil;
}

`` `

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

Да. Функция не будет делать то, что вы ожидаете, потому что указатель будет передан в нее по значению, а не по ссылке.

Представьте себе это:

- (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.

0 голосов
/ 16 марта 2012

Я использовал один из этих макросов, а затем пролистал этот пост .

Имеет смысл, что вы не хотите устанавливать nil во время разработки, поскольку вы хотите, чтобы он вызывал сбой по ссылке на dealloc и не отправлял его на nil.

0 голосов
/ 16 марта 2012

void SAFELY_RELEASE(id __POINTER) гарантированно __POINTER будет освобождаемым объектом.

Оба они не правы, потому что __POINTER = nil; не будет иметь никаких эффектов. Вы должны обнулить его в объекте (контроллере)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...