Spec-Zone.ru › GCC 14

8.9.4 Протокол быстрой перечисления

Если вы хотите, чтобы ваш собственный объект коллекции можно было использовать с быстрым перечислением, вам необходимо реализовать метод

- (unsigned long) countByEnumeratingWithState: (NSFastEnumerationState *)state
                                      objects: (id *)objects
                                        count: (unsigned long)len;

где NSFastEnumerationState должно быть определено в вашем коде следующим образом:

typedef struct
{
  unsigned long state;
  id            *itemsPtr;
  unsigned long *mutationsPtr;
  unsigned long extra[5];
} NSFastEnumerationState;

Если NSFastEnumerationState не определено в вашем коде, компилятор автоматически заменит NSFastEnumerationState * на struct __objcFastEnumerationState *, где этот тип неявно определен компилятором аналогичным образом. Это может быть запутанно, и мы рекомендуем определить NSFastEnumerationState (как показано выше) вместо этого.

Метод вызывается многократно во время быстрого перечисления для получения партий объектов. Каждый вызов метода должен возвращать следующую партию объектов.

Значение возвращаемого метода — количество объектов в текущей партии; оно не должно превышать len, что является максимальным размером партии, запрошенным вызывающим методом. Сама партия возвращается в поле itemsPtr структуры NSFastEnumerationState.

Для возврата объектов массив objects — это предварительно выделенный вызывающим методом (в стеке) массив C размером len. Во многих случаях вы можете поместить возвращаемые объекты в этот массив objects, а затем выполнить itemsPtr = objects. Но вы не обязаны этого делать; если ваша коллекция уже имеет объекты для возврата в виде массива C, она может возвращать их вместо этого.

Поля state и extra структуры NSFastEnumerationState позволяют вашему объекту коллекции отслеживать состояние перечисления. В простом массиве реализация state может отслеживать индекс последнего возвращенного объекта, а extra может оставаться неиспользуемым.

Поле mutationsPtr структуры NSFastEnumerationState используется для отслеживания мутаций. Оно должно указывать на число; перед обработкой каждого объекта цикл быстрого перечисления проверит, не изменилось ли это число. Если изменилось, произошла мутация, и быстрое перечисление прервётся. Таким образом, mutationsPtr можно настроить на указание на некий номер версии вашей коллекции, который увеличивается на единицу каждый раз при изменении (например, при добавлении или удалении объекта). Либо, если вас устраивают менее строгие проверки на мутации, он может указывать на количество объектов в вашей коллекции или на какое-то другое значение, которое можно проверить, чтобы приблизительно убедиться, что коллекция не была изменена.

Наконец, обратите внимание, как мы объявили аргумент len и значение возвращаемого типа unsigned long. Их также можно объявить как unsigned int, и всё равно всё будет работать.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Fast-enumeration-protocol.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API