Iphone 使用enumerateKeysAndObjectsUsingBlock遍历NSDictionary的键/值是否比循环键和调用objectForkey:更有效?

Iphone 使用enumerateKeysAndObjectsUsingBlock遍历NSDictionary的键/值是否比循环键和调用objectForkey:更有效?,iphone,ios,performance,nsdictionary,objective-c-blocks,Iphone,Ios,Performance,Nsdictionary,Objective C Blocks,我需要遍历字典中的所有键/值对,并对这两个字段进行处理。我想知道什么更有效,传统的“foreach键”方法还是使用enumerateKeysAndObjectsUsingBlock:的块方法 这里有一个例子: 传统方法(块前) 块方法 [self.dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ [self processKey:key value:obj]; }];

我需要遍历字典中的所有键/值对,并对这两个字段进行处理。我想知道什么更有效,传统的“foreach键”方法还是使用enumerateKeysAndObjectsUsingBlock:的块方法

这里有一个例子:

传统方法(块前)

块方法

 [self.dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
        [self processKey:key value:obj];
    }]; 
我的直觉是使用块遍历键/值对更快,但我不确定,因为我不知道字典和特定的块方法是如何实现的

有什么想法吗


提前谢谢

它们基本上是一样的——它们都是同步遍历。但是,以下内容将允许并行遍历,这将更快:

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

}];

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

块方法在使用大字典时要快得多,因为它不需要从每个键生成哈希,这相当慢。请参见此处的
CFStringHashNSString()
:您是指objectForKey:key而不是objectForKey:value吗?
[self.dictionary enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                              usingBlock:^(id key, id object, BOOL *stop) {

}];