Spec-Zone.ru › GCC 4

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-4.9.4/gcc/Fast-enumeration-protocol.html

Spec-Zone.ru

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