考虑这个Objective-C代码(启用ARC):
[self.aProperty sendMessage];
if (self.aProperty)
{
[self doSomethingWithProperty:self.aProperty];
}
我想知道如果将代码改写为下面的snipped会更快(在发布版本中):
MyPropertyClass* myProperty = self.aProperty;
[myProperty sendMessage];
if (myProperty)
{
[self doSomethingWithProperty:myProperty];
}
问题是Apple LLVM编译器3.0是否能够优化对财产获取者的重复访问?如果该属性是非原子的,它会有什么不同吗?
如果我不得不猜测,我会说编写下面的代码更快,因为编译器无法保证self.aProperty在这些行中不会改变。我是对的吗?
答案 0 :(得分:7)
比原子与非原子问题更重要的是吸气剂不能保证是纯粹的或幂等的。多次调用getter可能不等同于调用一次。例如,someNSEnumerator.nextObject
每次调用时都会返回不同的结果。因此,在一般情况下,这样的优化是不可能的。
然而,关于“更快”,我怀疑任何代码片段都会明显加快。正确的答案是分析,看看如果这个代码经常运行足以值得麻烦,它是否有任何区别。