gpt4 book ai didi

objective-c - Objective-C 中的快速枚举与 NSEnumerator

转载 作者:太空狗 更新时间:2023-10-30 03:25:00 31 4
gpt4 key购买 nike

我一遍又一遍地看到这个,为什么在循环中使用快速枚举比使用 nextObject:NSEnumerator 更快。​​

最佳答案

NSEnumerator是枚举集合的旧方法。它涉及创建一个对象来表示枚举,然后为每次迭代调用一个方法。虽然这多年来一直很好用,但效率并不高,因为它涉及为循环的每次迭代至少发送一条消息。 NSFastEnumeration是更现代的方法,它利用本地语言支持来提供更有效的枚举。它在幕后的工作方式是创建一个表示当前枚举状态的结构并重复调用 -countByEnumeratingWithState:objects:count:在集合上。此方法在 objects 输出参数中返回一个 C 对象数组,并在 count 输出参数中返回一个计数器。这允许调用者随后迭代 C 数组。从本质上讲,这意味着每个对象 block 一个消息调用,根据集合的不同,这可能与获取所有对象的单个消息调用一样高效。

如果你有一些看起来像这样的代码

for (id obj in myArray) {
[obj doSomething];
}

这被编译器翻译成大致等同于

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];
}
}

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

关于objective-c - Objective-C 中的快速枚举与 NSEnumerator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5163169/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com