2011-09-22 60 views
13

我需要遍历字典的所有键/值对,并对两个字段执行某些操作。我想知道什么是更有效率,传统的'foreach关键'方法或块方法使用enumerateKeysAndObjectsUsingBlock :.遍历键/值的NSDictionary,是enumerateKeysAndObjectsUsingBlock比循环键和调用objectForkey更高效:?

这里有一个例子:

传统的方法(块)之前

for (NSString* key in [self.dictionary allKeys]) { 
    [self processKey:key value: [self.dictionary objectForKey:value ]]; 
} 

块的方法。

[self.dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ 
     [self processKey:key value:obj]; 
    }]; 

我的直觉是,遍历使用块的键/值对速度更快,但我不知道,因为我不知道怎样词典和特定块的方法来实现。

有什么想法?

在此先感谢!

+0

你的意思是objectForKey:key而不是objectForKey:value? – ohthepain

回答

11

您应该使用基于块的方法。这是更快的,因为shown here。特别是,它不需要在字典中进行额外的查找来获取值,从而可以节省性能。但是,除非使用合理大小的字典进行操作,否则性能收益可以忽略不计。

11

他们会基本相同 - 他们都是同步遍历。但是,以下内容将允许并发遍历,这将会更快:

[self.dictionary enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent 
           usingBlock:^(id key, id object, BOOL *stop) { 

}]; 
+1

对于大型字典,块方法比较快,因为它不需要从每个密钥生成哈希,这很慢。请参阅'CFStringHashNSString()':http://opensource.apple.com/source/CF/CF-476.17/CFString.c –