以下哪项在iOS中效率更高或更快?

时间:2014-01-22 06:03:25

标签: objective-c

以下哪项在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];
}

3 个答案:

答案 0 :(得分:2)

随着今天设备的速度,我怀疑会有任何可衡量的差异。但是还有其他一些观察结果:

  1. 根据其他评论,在这些情况下使用静态变量并不是一个好主意。事实上,我建议只使用绝对必要的静态。

  2. 除非必要,我建议人们避免使用viewWithTag:。首先找到控件似乎是一个简单的解决方案。但是一旦你的项目变得更大或者其他程序员加入,它就可能导致出现错误。我建议使用IBOutlets和/或UIView扩展,以便您可以直接访问对控件的正确类型引用,这些控件始终指向您想要的控件。

  3. 通过使用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的此实例是唯一的,而是跨实例共享的。鉴于你正在处理观点,我怀疑这种行为是可取的。