我已经看到了这个问题,为什么在循环中使用快速枚举的速度更快,而不是使用nextObject:
的NSEnumerator
。Objective-C中的快速枚举与NSEnumerator对比-I
10
A
回答
29
NSEnumerator
是列举集合的老方法。它涉及创建一个对象来表示枚举,然后为每个迭代调用一个方法。虽然这是多年来的完美服务,但它并不是非常有效,因为它至少为循环的每次迭代发送一条消息。 NSFastEnumeration
是更现代的方法,它利用本地语言支持来提供更高效的枚举。它的工作方式是创建一个表示当前枚举状态的结构,并在集合上重复调用-countByEnumeratingWithState:objects:count:
。这个方法返回一个C对象的objects
out-param对象和一个count
out-param中的一个计数器。这使得调用者可以遍历C数组。实质上,这意味着每个对象的消息调用,这取决于集合,可能与单个消息调用以获得所有对象一样高效。
如果你有一些代码,看起来像
for (id obj in myArray) {
[obj doSomething];
}
这被编译器翻译成东西大致相当于
实际使用的变量是隐藏的,并且最大尺寸对象缓冲区的内容也是实现依赖的,但基本思想在那里。它将对obj-c集合的迭代转换为通过C数组进行迭代。
0
NSArray *array = something;
阵列= {{1,2},{2,3},{3,4}}
这意味着阵列是阵列的阵列。所以你如何访问所有的数组和它们的值。 我们可以使用for循环这样
for (int i = 0; i < array.count; i++)
{
NSArray x = [array objectAtIndex:i];
}
或快速枚举是这样的
for(NSArray array2 in array)
{
// do what ever you want with this new array2.
}
这是一个简单的例子。 PS:我忘记了数组在控制台中的外观。
2
GNUstep libs/base/trunk/Source/NSEnumerator.m countByEnumeratingWithState:对象:伯爵:
这是不一样的苹果的实现,但它有助于理解。
- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state
objects: (id*)stackbuf
count: (NSUInteger)len
{
IMP nextObject = [self methodForSelector: @selector(nextObject)];
int i;
state->itemsPtr = stackbuf;
state->mutationsPtr = (unsigned long*)self;
for (i = 0; i < len; i++)
{
id next = nextObject(self, @selector(nextObject));
if (nil == next)
{
return i;
}
*(stackbuf+i) = next;
}
return len;
}
相关问题
- 1. 快速枚举?
- 2. 快速枚举类对象
- 3. 快速枚举的顺序和比较
- 4. 快速枚举NSFetchedResult
- 5. 枚举与对比的UnitOfWork
- 6. NSIndexSet上的快速枚举
- 7. iPhone:快速枚举,速度不够快?
- 8. 快速枚举和选择对象
- 9. 快速枚举NSDictionary持有NSDictionary对象
- 10. NSMutableArray快速枚举问题
- 11. 用enumeratorAtPath快速枚举?
- 12. 快速枚举错误?
- 13. 在快速枚举中访问值
- 14. 如何快速枚举和比较Objective-C中许多NSArrays的对象?
- 15. 快速枚举NSDictionary的错误
- 16. 快速枚举逻辑错误检查比较UITableViewCell
- 17. 快速枚举有哪些限制?
- 18. 提高快速枚举性能
- 19. 快速枚举运算符重载
- 20. 按类型快速访问枚举
- 21. 快速枚举整数数组
- 22. 通过UICollectionView单元快速枚举 - Swift
- 23. 如何停止快速枚举?
- 24. 提早退出快速枚举循环?
- 25. Objective C快速枚举问题
- 26. 比较枚举与iteratee包
- 27. 与枚举值JSTL比较
- 28. 比较对象枚举
- 29. 如何迅速比较枚举?
- 30. 如何使用的NSMutableSet快速枚举与NSPredicate作为过滤
...和'enumerateObjectsUsingBlock:'将会快速(NSArray)或明显更快(枚举值时的NSDictionary),然后快速枚举.... – bbum 2011-03-02 04:25:31