gpt4 book ai didi

objective-c - 如何实现 NSFastEnumeration 协议(protocol)?

转载 作者:太空狗 更新时间:2023-10-30 03:12:14 24 4
gpt4 key购买 nike

我有一个类,我希望我的类确认 NSFastEnumeration 协议(protocol)。我已经阅读了文档,但并不是很清楚。谁能告诉我协议(protocol)方法应该返回什么以及它是如何工作的?

最佳答案

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

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

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

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

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

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

进一步阅读:

关于objective-c - 如何实现 NSFastEnumeration 协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4872509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com