Как очистить память при сбое пользовательской инициализации - PullRequest
3 голосов
/ 27 июля 2011

Когда мой пользовательский инициализатор не работает, я должен вернуть ноль.Каково соглашение для очистки памяти, выделенной мной в инициализаторе, которая, как я ожидал, будет очищена в dealloc?

Вот надуманный пример:

- (id)init
{
    if ((self = [super init])) {
        instanceVar1 = [[NSString alloc] initWithString:@"blah"];
        if (bad_thing_oh_noes) {
            return nil;
        }
    }
    return self;
}

- (void)dealloc
{
    [instanceVar1 release];

    [super dealloc];
}

Aболее реалистичным обстоятельством, при котором я не могу эффективно проверить каждое состояние ошибки перед выполнением выделения, будет десериализация сложного объекта, содержащего массивы и т. п.

В любом случае, очищать ли выделенную память перед возвратом nil,отправьте сообщение dealloc самому себе перед возвратом ноля, или мне все это удалось волшебным образом?

1 Ответ

2 голосов
/ 27 июля 2011

Если во время инициализатора возникает ошибка, вы должны позвонить release на self и вернуть nil.

if (bad_thing_oh_noes) {
    [self release];
    return nil;
}

Также вы должны убедиться, что вызов * 1007 безопасен* на частично инициализированном объекте.

Вы должны вызывать release только в точке сбоя.Если вы получаете nil обратно из инициализатора суперкласса, вы не должны вызывать release.

Обычно вы не должны вызывать исключение при ошибке инициализации.

Пример из Ошибка инициализации обработки :

- (id)initWithURL:(NSURL *)aURL error:(NSError **)errorPtr {

    self = [super init];
    if (self) {

        NSData *data = [[NSData alloc] initWithContentsOfURL:aURL
                                       options:NSUncachedRead error:errorPtr];

        if (data == nil) {
            // In this case the error object is created in the NSData initializer
            [self release];
            return nil;
        }
        // implementation continues...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...