如何实现NSFastEnumeration协议?

The*_*mer 22 cocoa objective-c fast-enumeration

我有一个班级,我希望我的班级确认NSFastEnumeration协议.我已阅读文档,但不是很清楚.有人可以告诉我协议方法应该返回什么以及它是如何工作的?

jus*_*tin 43

Apple的FastEnumerationSample向您展示了该怎么做,但这里有一个细分.

唯一的NSFastEnumeration方法是countByEnumeratingWithState:objects:count:返回集合的块.只要需要更多项目就会执行它,直到它通过返回0指示没有更多项目.块作为ids 的C数组传递.

在该方法中,该state参数包含您将使用的大部分(如果不是全部)数据.您需要设置state->itemsPtr和更新state->state每个单独的调用countByEnumeratingWithState:objects:count:.以下是每个领域的简要说明NSFastEnumerationState:

  • state:表示迭代序列中的位置.对于索引集合,这将是索引.对于链表,这可以是节点指针.对于其他类型,这可能是更复杂的类型(例如,对于树,state->state可以是用作存储节点的堆栈的NSMutableArray).当countByEnumeratingWithState:objects:count:第一次调用时,state->state为0; 检查此条件以初始化state结构.
  • itemsPtr:块中的项目; 指向ids 的C数组.Cocoa将遍历此数组,依次将每个项绑定到for-in循环中指定的变量.
  • mutationsPtr:对于可变集合,用于指示自上次调用以来集合已更改countByEnumeratingWithState:objects:count:.通常,在初始化状态时,您需要设置一次.集合mutators增加了它指向的值.Cocoa会将返回countByEnumeratingWithState:objects:count:的值与上一次调用的值进行比较; 如果它们不同,Cocoa会抛出异常.
  • extra:您可以使用它来存储额外的数据.

你可以设置state->state和任何state->extra你想要的元素; 它们仅为方便起见而提供,并不影响Cocoa.state->itemsPtr,*state->mutationsPtr然而,该方法返回的值确实会影响Cocoa.

至于另外两个方法参数,stackbuf是Cocoa提供的用于保存项目的数组.它的使用是可选的,但如果你不使用它,你将不得不为其分配存储空间state->itemPtr.如果使用它,state->itemsPtrstackbuf在每次调用时设置为.lenstackbuf您可以在其中存储的最大项目数的长度.

进一步阅读: