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