2011-03-02 26 views

回答

29

NSEnumerator是列举集合的老方法。它涉及创建一个对象来表示枚举,然后为每个迭代调用一个方法。虽然这是多年来的完美服务,但它并不是非常有效,因为它至少为循环的每次迭代发送一条消息。 NSFastEnumeration是更现代的方法,它利用本地语言支持来提供更高效的枚举。它的工作方式是创建一个表示当前枚举状态的结构,并在集合上重复调用-countByEnumeratingWithState:objects:count:。这个方法返回一个C对象的objects out-param对象和一个count out-param中的一个计数器。这使得调用者可以遍历C数组。实质上,这意味着每个对象的消息调用,这取决于集合,可能与单个消息调用以获得所有对象一样高效。

如果你有一些代码,看起来像

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

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

​​

实际使用的变量是隐藏的,并且最大尺寸对象缓冲区的内容也是实现依赖的,但基本思想在那里。它将对obj-c集合的迭代转换为通过C数组进行迭代。

+7

...和'enumerateObjectsUsingBlock:'将会快速(NSArray)或明显更快(枚举值时的NSDictionary),然后快速枚举.... – bbum 2011-03-02 04:25:31

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:我忘记了数组在控制台中的外观。

+1

这只是语法糖,它并没有回答为什么一个比另一个更快。 – shreyasva 2011-03-02 04:19:51

+0

哦对不起,我没有读你完整的问题。 – Robin 2011-03-02 04:23:29

2

这是不一样的苹果的实现,但它有助于理解。

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