在for:in循环期间重新分配NSArray指针是否安全?

时间:2016-02-01 22:34:54

标签: objective-c arrays multithreading

主题1:

self.array = [[NSMutableArray alloc] init];
/* load array */

主题2:

for (NSObject* object in self.array) {
    /* do stuff */
}

这样安全吗?在for:in循环期间何时以及多久访问一次self.array?

如果我重新分配self.array,在循环期间,线程2会继续和平地循环遍历旧实例,还是会切换到新实例,可能会导致突变异常?

1 个答案:

答案 0 :(得分:1)

for/in循环中,集合是一个表达式。在您的情况下,该表达式为self.array。程序在循环开始时计算该表达式的值一次。在您的情况下,它会在循环开始时调用self.array一次。

在循环执行时,您可以安全地将self.array替换为另一个数组。

不能做的是在循环执行时就地修改数组。也就是说,您不能将一个元素替换为另一个元素,或添加元素或删除元素。如果这样做,您将收到运行时错误(因为NSFastEnumeration中的NSArray实现明确检查了突变。)