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