iOS:修改NSFastEnumerationState以在枚举时隐藏变异

时间:2013-11-19 11:06:30

标签: ios nsenumerator nsfastenumeration

我有一个案例,我的馆藏会在枚举时发生变异。但iOS中不允许这样做。进一步的调查发现NSFastEnumerationState是一个c型结构如下

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

所以state-> mutationPtr表示集合是否被突变,基于抛出的异常。我们可以覆盖它以表明集合没有变异(即使它被变异),所以异常是没有抛出。压倒一切,我们可以在枚举时实现变异。我不知道这是不是一个正确的想法。请让我知道你的建议。

2 个答案:

答案 0 :(得分:2)

这个想法不正确,只需复制您枚举的对象并枚举副本。

修改:为了解决您的意见,似乎在技术上可以达到您想要的效果。我做的第一件事是转到NSEnumerator documentation检查你是否可以基本上创建自己的枚举器并实现自定义 nextObject 方法来解决问题。这是我发现的:

  

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

此外,我检查了Enumeration: Traversing a Collection’s Elements - Using an Enumerator section,我发现了一个非常类似的事情:

  

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

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

  1. 创建自定义 NSEnumerator 子类,并使用它来执行您所需的操作。
  2. 根本不要使用 NSFastEnumeration ,并找到另一种方法来做你需要的。

答案 1 :(得分:0)

http://www.mikeash.com/pyblog/friday-qa-2011-10-14-whats-new-in-gcd.html。这个链接提供了一些关于这个问题的好信息。它在一定程度上帮助了我。