0

我有一个案例,我的集合在枚举时会发生突变。但这在 iOS 中是不允许的。进一步调查发现 NSFastEnumerationState 是 ac 类型结构,如下所示

typedef struct {
        unsigned long state;
        id *itemsPtr;
        unsigned long *mutationsPtr;
        unsigned long extra[5];
    } NSFastEnumerationState;

所以 state->mutationPtr 表示集合是否发生了变异,基于哪些异常被抛出。我们是否可以覆盖这个来表明集合没有发生变异(即使它已经发生了变异),这样就不会抛出异常。通过覆盖我们可以在枚举时实现突变。我不知道这是否是一个正确的想法。请让我知道您的建议。

4

1 回答 1

2

这个想法是错误的,只是复制你正在枚举的对象并枚举副本。

编辑:为了解决您的评论,似乎在技术上可以实现您想要的。我做的第一件事是去NSEnumerator 文档检查您是否可以基本上创建自己的枚举器并实现自定义的nextObject方法来解决问题。这是我发现的:

注意:在枚举时修改可变集合是不安全的。某些枚举器当前可能允许枚举已修改的集合,但不保证将来会支持此行为。

此外,我检查了Enumeration: Traversing a Collection's Elements - Using an Enumerator 部分,我发现了一个非常相似的东西:

在枚举可变集合时删除、替换或添加到可变集合的元素是不安全的。如果您需要在枚举期间修改集合,您可以制作该集合的副本并使用该副本进行枚举,或者在枚举期间收集您需要的信息并在之后应用更改。

所以,如果你总结这一切,在我看来你有两个选择:

  1. 创建您的自定义NSEnumerator子类并使用它来做您需要的事情。
  2. 根本不要使用NSFastEnumeration并找到另一种方法来做你需要的事情。
于 2013-11-19T11:09:39.240 回答