如何实现NSFastEnumeration协议?

时间:2011-02-02 09:08:59

标签: objective-c cocoa fast-enumeration

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

2 个答案:

答案 0 :(得分:42)

Apple的FastEnumerationSample向您展示了该怎么做,但这是一个细分。

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

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

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

您可以将state->statestate->extra的任何元素设置为您想要的任何内容;它们仅为方便起见而提供,并不影响Cocoa。但是,state->itemsPtr*state->mutationsPtr以及方法返回的值会影响Cocoa。

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

进一步阅读:

答案 1 :(得分:3)

在找到一个很好的解释后,恢复这个线程。 Apple链接似乎被打破了。你可以在这里试试:https://developer.apple.com/library/ios/#samplecode/FastEnumerationSample/Introduction/Intro.html

我发现的实现快速枚举的最佳示例是:http://mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html。它看起来比现在糟糕得多。