Структура сгенерированной iOS функции для initWithNibName - PullRequest
0 голосов
/ 08 августа 2011

Я часто использую функцию initWithNibName для инициализации содержимого в моих контроллерах представления. Я просто замечаю, что сгенерированная функция initWithNibName выполняет нулевую проверку self.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if(self) {
    //do some initializing
  }
  return self;
}

Почему для self есть нулевая проверка, а если нет, то код инициализации nil run? Будет ли это if-statement когда-нибудь ложным? Почему яблоко настаивает, чтобы я проверил ноль здесь?

Ответы [ 3 ]

2 голосов
/ 08 августа 2011

Проще говоря, если какой-либо случай возникает, когда ваше перо не загружено по «какой-либо» причине, не будет никакого смысла инициализировать контроллер, и поэтому

a self.backgroundcolor = [UIColor blackColor]; будет выполняться только когда self не 'nil'.

В противном случае метод просто вернет 'nil'

1 голос
/ 08 августа 2011

Как я уже говорил в комментарии выше, причина использования шаблона if (self) обсуждается в «Обработка сбоя при инициализации» .

Этот шаблон не является специфичным для initWithNibName:, он применяется к методам инициализатора в целом.

Оператор if используется, чтобы избежать инициализации переменных экземпляра, если self равен nil.Это важно, потому что доступ к памяти для переменных экземпляра, если self равен nil, может быть ошибкой.

См. Также этот вопрос: шаблон метода init

1 голос
/ 08 августа 2011

Если вдруг в системе, например, не хватает памяти или возникли другие проблемы, из-за чего ваш nib-файл не загружен, а ваши представления не загружены в память, проверка nil заставит ваш viewcontroller изящно завершить работу вместо сбоя.

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

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