Переменная экземпляра, используемая, когда для «я» не установлено значение «[(super или self) init]»

- (id)init{
    if(![super init]){
        return nil;
    }
    _rssItems = [[NSMutableArray alloc]init];
    return self;
}

Если я анализирую свой проект, я получаю это предупреждение:

Переменная экземпляра, используемая, когда для 'self' не установлено значение '[(super or self) init...]'

Что мне нужно изменить?

Спасибо!


person AmiiQo    schedule 21.01.2012    source источник


Ответы (1)


В настоящее время официальная рекомендация Apple такова:

- (id)init{
    self = [super init];
    if(self){
        _rssItems = [[NSMutableArray alloc]init];
    }
    return self;
}

Идея состоит в том, что init (в частности, в данном случае [super init]) может возвращать объект, отличный от себя, и ожидаемое поведение в этом случае состоит в том, чтобы вместо этого работать с этим объектом — самый простой способ справиться с этим — просто установите self на то, что возвращает super. Также обратите внимание, что return self; отлично работает независимо от того, равно ли self nil или нет, следовательно, ваше if меняется на противоположное.

Конечно, большинство классов не выполняют этот трюк переключения, но в любом случае это хорошая практика, потому что Apple ожидает, что все будут использовать именно этот шаблон для своих init, поэтому даже если ваш подкласс в настоящее время работает без назначения до self, они могут легко изменить это поведение в будущем без предупреждения.

person andyvn22    schedule 21.01.2012
comment
Спасибо, но теперь мое приложение падает, потому что EXC_BAD_ACCESS... Странно, потому что предыдущая проблема исчезла. - person AmiiQo; 22.01.2012