Быстрое перечисление по нулевому объекту

#objective-c #fast-enumeration

#objective-c #быстрое перечисление

Вопрос:

Что здесь должно произойти? Безопасно ли это?

 NSArray *nullArray=nil;
for (id obj in nullArray) {
  // blah
}
  

Более конкретно, должен ли я это делать:

 NSArray *array=[thing methodThatMightReturnNil];
if (array) {
  for (id obj in array) {
    // blah
  }
}
  

или это нормально?:

 for (id obj in [thing methodThatMightReturnNil]) {
  // blah
}
  

Комментарии:

1. @JeremyP: Я сам чуть не сказал это, но приятно знать, что не только то, что это работает, но и то, что это работает по замыслу, есть независимые от реализации причины, по которым это работает, и, вероятно, это продолжит работать в будущих версиях OS X.

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

Ответ №1:

Быстрое перечисление реализуется с помощью метода - countByEnumeratingWithState:objects:count: , который возвращает 0, чтобы сигнализировать об окончании цикла. Поскольку nil возвращает 0 для любого метода, ваш цикл никогда не должен выполняться. (Так что это безопасно.)

Ответ №2:

Ничего не произойдет. Цикл for-in использует NSFastEnumeration протокол для перебора элементов в коллекции, поэтому вы, по сути, отправляете сообщение, nil которому безопасно в Objective-C.