KVC vs快速枚举

时间:2013-05-02 11:50:36

标签: iphone ios objective-c ipad kvc

以下哪项更快,为什么?

CGFloat sum = 0;
for (UIView *v in self.subviews)
    sum += v.frame.size.height;

CGFloat sum = [[self.subviews valueForKeyPath:@"@sum.frame.size.height"] floatValue];

3 个答案:

答案 0 :(得分:12)

真的,很多优雅(或聪明)的语言归结为它如何避免循环。 for; while;甚至快速枚举表达式都是拖累。无论你如何对它们进行糖衣,循环都将是一段代码,它可以用自然语言来描述更简单的东西。

“告诉我这个阵列中所有员工的平均工资”,

double totalSalary = 0.0;
for (Employee *employee in employees) {
  totalSalary += [employee.salary doubleValue];
}
double averageSalary = totalSalary / [employees count];

...对比

幸运的是,键值编码为我们提供了一种更为简洁 - 几乎类似Ruby的方式 - :

[employees valueForKeyPath:@"@avg.salary"];

KVC Collection Operators允许使用 valueForKeyPath:中的键路径表示法对集合执行操作。

每次在密钥路径中看到 @ 时,它都表示一个特定的聚合函数,其结果可以返回或链接,就像任何其他密钥路径一样。

快速枚举比KVC更快。

希望它对你有所帮助。

答案 1 :(得分:6)

首先,你的KVC表达不起作用; KVC不能用于检索struct成员(除了非常有限的情况,其中一个类有一个特殊的valueForKey:实现进行特殊处理)。

其次,这就像过早优化一样。

您是否实际量化了与此代码相关的性能问题?

如果没有,您就是在浪费时间“优化”此代码路径。

除此之外,使用KVC进行此类操作会给代码带来相当大的脆弱性。编译器无法验证传递给valueForKey:的表达式,因此,编译时错误或警告现在是运行时的错误,只有在执行该代码路径时才会发现错误。

答案 2 :(得分:0)

另请参阅Apple文档:

  

虽然键值编码是有效的,但它增加了一个间接级别   这比直接方法调用稍慢。你应该用   键值编码只有在您可以从灵活性中受益时   它提供了。

Key Value Coding Docs