快速枚举与Objective-C中的NSEnumerator

shr*_*sva 10 nsenumerator objective-c fast-enumeration

我一遍又一遍地看到这一点,为什么在循环中使用快速枚举而不是NSEnumerator使用它更快nextObject:.

Lil*_*ard 29

NSEnumerator是枚举集合的旧方法.它涉及创建一个表示枚举的对象,然后为每次迭代调用一个方法.虽然这可以使用多年,但它并不是非常有效,因为它涉及至少一个消息发送循环的每次迭代.NSFastEnumeration是一种更现代的方法,它利用本地语言支持来提供更有效的枚举.它的工作方式是创建一个表示当前枚举状态的结构,并重复调用-countByEnumeratingWithState:objects:count:该集合.此方法返回objectsout-param 中的C对象数组以及out-param中的计数器count.这允许调用者迭代C数组.本质上,这意味着每个对象的一个​​消息调用,根据集合,可以像获取所有对象的单个消息调用一样高效.

如果您有一些看起来像的代码

for (id obj in myArray) {
    [obj doSomething];
}
Run Code Online (Sandbox Code Playgroud)

这会被编译器翻译成大致相当于的东西

NSFastEnumerationState __enumState = {0};
id __objects[MAX_STACKBUFF_SIZE];
NSUInteger __count;
while ((__count = [myArray countByEnumeratingWithState:&__enumState objects:__objects count:MAX_STACKBUFF_SIZE]) > 0) {
    for (NSUInteger i = 0; i < __count; i++) {
        id obj = __objects[i];
        [obj doSomething];
    }
}
Run Code Online (Sandbox Code Playgroud)

使用的实际变量是隐藏的,对象缓冲区的最大大小也是依赖于实现的,但基本的想法是存在的.它将obj-c集合上的迭代转换为C数组上的迭代.

  • ...和`enumerateObjectsUsingBlock:`将同样快(NSArray)或明显更快(枚举值时的NSDictionary)然后快速枚举.... (7认同)