以下哪项在iOS中效率更高或更快?
/ *公共静态变量* /
static UICollectionView *mDocsCollection;
@interface ClassA ()
{
}
@end
@implementation ClassA
- (UICollectionView *)documentsCollection
{
if (!mDocsCollection) {
mDocsCollection = (UICollectionView *)[self.view viewWithTag:VIEW_TAG_DOCS_COLLECTION];
}
return mDocsCollection;
}
@end
/ *接口变量* /
@interface ClassA ()
{
UICollectionView *mDocsCollection;
}
@end
@implementation ClassA
- (UICollectionView *)documentsCollection
{
if (!mDocsCollection) {
mDocsCollection = (UICollectionView *)[self.view viewWithTag:VIEW_TAG_DOCS_COLLECTION];
}
return mDocsCollection;
}
@end
/ *私有静态变量* /
- (UICollectionView *)documentsCollection
{
static UICollectionView *docsCollection;
if (!docsCollection) {
docsCollection = (UICollectionView *)[self.view viewWithTag:VIEW_TAG_DOCS_COLLECTION];
}
return docsCollection;
}
/ *每次都进行类型转换(使用无变量)* /
- (UICollectionView *)documentsCollection
{
return (UICollectionView *)[self.view viewWithTag:VIEW_TAG_DOCS_COLLECTION];
}
答案 0 :(得分:2)
随着今天设备的速度,我怀疑会有任何可衡量的差异。但是还有其他一些观察结果:
根据其他评论,在这些情况下使用静态变量并不是一个好主意。事实上,我建议只使用绝对必要的静态。
除非必要,我建议人们避免使用viewWithTag:。首先找到控件似乎是一个简单的解决方案。但是一旦你的项目变得更大或者其他程序员加入,它就可能导致出现错误。我建议使用IBOutlets和/或UIView扩展,以便您可以直接访问对控件的正确类型引用,这些控件始终指向您想要的控件。
通过使用IBOutlet或属性,您根本不需要以下任何方法:)
答案 1 :(得分:1)
最后一个是最慢的。其他同样快,可能只有几个机器指令。
文件范围静态和方法范围静态做同样的事情。伊娃做了一些非常不同的事情。如果您有多个ClassA实例或多个线程,这很重要,在这种情况下静态可能完全错误。
答案 2 :(得分:0)
我怀疑在这种情况下可以观察到差异,但你可以对它进行基准测试并看到。一个简单的基准会做类似的事情:
CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
// put the code to benchmark here
NSLog(@"elapsed = %f seconds", CFAbsoluteTimeGetCurrent() - startTime);
您可能需要多次重复测试,以便为生成的数字建立置信度。另请注意,测试它们的顺序会影响结果,因此您可能希望延迟基准测试代码,直到应用程序真正完成加载并安静下来。
理论上,如果你经常调用这个documentsCollection
方法,将值存储在变量中可能会提供一些性能提升,但是在使用时你只会烦恼这种实现一些非常昂贵的方法,或者如果你经常调用它。
仅供参考,static
实现可能导致非常不同的行为,如果您可能不止一次重新ClassA
(即关闭视图控制器并稍后重新呈现)。 static
变量不仅对ClassA
的此实例是唯一的,而是跨实例共享的。鉴于你正在处理观点,我怀疑这种行为是可取的。