【发布时间】:2011-06-19 20:10:04
【问题描述】:
我有一个班级,我希望我的班级确认 NSFastEnumeration 协议。我已经阅读了文档,但不是很清楚。谁能告诉我协议方法应该返回什么以及它是如何工作的?
【问题讨论】:
标签: objective-c cocoa fast-enumeration
我有一个班级,我希望我的班级确认 NSFastEnumeration 协议。我已经阅读了文档,但不是很清楚。谁能告诉我协议方法应该返回什么以及它是如何工作的?
【问题讨论】:
标签: objective-c cocoa fast-enumeration
Apple 的 FastEnumerationSample 向您展示了该怎么做,但这里有一个细分。
唯一的NSFastEnumeration 方法countByEnumeratingWithState:objects:count: 返回集合的块。它在需要更多项目时执行,直到通过返回 0 指示没有更多项目。块作为 ids 的 C 数组传递。
在该方法中,state 参数包含您将使用的大部分(如果不是全部)数据。您需要设置state->itemsPtr 并在每次单独调用countByEnumeratingWithState:objects:count: 时更新state->state。下面简单介绍一下NSFastEnumerationState的各个字段:
state:表示被迭代的序列中的位置。对于索引集合,这将是索引。对于链表,这可能是一个节点指针。对于其他类型,这可能是更复杂的类型(例如,对于树,state->state 可能是用作存储节点的堆栈的 NSMutableArray)。第一次调用countByEnumeratingWithState:objects:count:时,state->state为0;检查此条件以初始化 state 结构。itemsPtr:块中的项目;指向ids 的 C 数组。 Cocoa 将遍历这个数组,依次将每个项目绑定到 for-in 循环中命名的变量。mutationsPtr:对于可变集合,用于表示自上次调用 countByEnumeratingWithState:objects:count: 以来集合已更改。通常,您会在初始化状态时设置一次。集合修改器递增 this 指向的值。 Cocoa 会将countByEnumeratingWithState:objects:count: 返回的值与上一次调用的值进行比较;如果它们不同,Cocoa 将抛出异常。extra:你可以用它来存储额外的数据。您可以将state->state 和state->extra 的任何元素设置为任何您想要的;它们只是为了您的方便而提供,不会影响 Cocoa。但是,state->itemsPtr、*state->mutationsPtr 和方法返回的值确实会影响 Cocoa。
至于其他两个方法参数,stackbuf 是 Cocoa 提供的用于保存项目的数组。它的使用是可选的,但如果你不使用它,你将不得不为state->itemPtr分配存储空间。如果您使用它,请在每次调用时将 state->itemsPtr 设置为 stackbuf。 len 是 stackbuf 的长度,即您可以在其中存储的最大项目数。
进一步阅读:
【讨论】:
在找到一个很好的解释后才恢复这个线程。 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。它看起来比实际更糟糕。
【讨论】: