NSEnumerator性能与Cocoa中的for循环
时间:2020-03-05 18:44:34 来源:igfitidea点击:
我知道,如果我们有一个循环来修改循环中项目的计数,则在集合上使用NSEnumerator是确保代码爆炸的最佳方法,但是我想了解NSEnumerator类之间的性能折衷只是一所古老的学校
解决方案
回答
它们非常相似。现在,使用Objective-C 2.0时,大多数枚举默认为NSFastEnumeration
,它会为该集合中的每个对象创建一个地址缓冲区,然后可以传递该对象。通过经典的for循环保存的一个步骤是不必在循环内每次都调用objectAtIndex:i
。我们要枚举的集合的内部实现了快速枚举,而无需调用objectAtIndex:i方法。
缓冲区是我们无法在枚举时对集合进行变异的部分原因,对象的地址将更改,并且已建立的缓冲区将不再匹配。
另外,2.0中的格式看起来像经典的for循环一样好:
for ( Type newVariable in expression ) { stmts }
阅读以下文档以更深入了解:
NSFastEnumeration协议参考
回答
通常,在Objective-C 2.0中使用新的for(... in ...)语法是迭代集合的最快方法,因为它可以在堆栈上维护一个缓冲区并将成批的项目放入其中。
使用" NSEnumerator"通常是最慢的方法,因为它通常会复制要迭代的集合。对于不可变的集合,这可能很便宜(相当于" -retain"),但是对于可变的集合,这可能会导致创建不可变的副本。
例如,使用-[NSArray objectAtIndex:]进行自己的迭代通常会介于两者之间,因为虽然我们没有潜在的复制开销,但是我们也不会从基础集合中获取成批对象。
(PS这个问题应该标记为Objective-C,而不是C,因为NSEnumerator是可可类,并且新的for(... in ...)语法特定于Objective-C。