swift中静态函数和单例类之间的区别

时间:2016-06-14 08:39:54

标签: ios swift singleton static-methods

我想创建一个类,其中将保留所有实用程序方法,并且这些方法将在整个应用程序中使用 的问题:1
创建一个单例类并保留所有必要的方法或者我应该创建一个所有函数都是静态的类是很好的 的问题:2
swift上面两种方法的主要区别是什么? 的问题:3
它将如何影响iOS的性能?

3 个答案:

答案 0 :(得分:26)

假设我们有两个班级。

包含所有静态方法和静态变量的类 这样,您可以在不实例化对象的情况下访问类方法。此外,如果需要一些小数据句柄,它们可以存储在静态变量中。访问此类的所有线程最终都不会创建重复的数据变量实例。

Singleton Class 该类将具有私有init方法,并通过静态实例共享单个实例。访问实例的所有线程都不会最终创建重复的数据变量实例。

从技术上讲,两者对于Utility类的场景可能听起来非常相似,并且可能会让您做出决定时感到困惑,您可以使用以下用例来做出决定。

  • 此类主要定义逻辑实现吗?如果类方法的主要目的是提供逻辑计算/操作或操作,除了临时句柄之外不需要在变量中存储数据,那么您应该始终选择静态类。对于例如你在这里提到的实用类。调整图像大小,读取文件,解析数据结构等实用方法最好使用静态方法完成。

  • 如果您的类要求将重要信息存储在多个变量中,限制资源访问(例如限制数据库上的同时事务数或限制同时网络调用的数量),它经常分配和释放资源(管理内存)运行时)然后最好使用Singleton类(例如用于访问数据库结构的类,管理网络资源等。)

答案 1 :(得分:23)

当然这听起来令人困惑,可以辩论。但是,从最佳实践中我可以提出一些建议。

Singleton 通常用于创建资源密集型和一个计时器初始化,例如:数据库连接器,登录处理程序等。

实用程序类是只具有静态函数和变量的类。它不应该处理异步任务和昂贵的资源处理,如打开数据库连接器。

在您的情况下,如果实用程序正在执行一些资源密集型过程,则最好将其包装为单例。如果没有,那么我认为类中的静态函数更好。这也是因为,Swift将使用静态调度在类中调度所有静态函数。虽然Swift喜欢优化,但在Singleton中这不可能是真的。

静态调度比Dynamic Dispatch快4倍,只要使用Objective-C运行时。对于斯威夫特来说也是如此。但是,动态调度只需4纳秒。

我希望这能让你清楚。

答案 2 :(得分:6)

staticsingleton之间的主要区别在于Singleton可以实现Protocols并从某些基类派生。在Singleton的情况下,可以实例化类,但只能实例化一次。 Static函数可以直接使用而无需实例化。

因此,如果要为实用程序方法创建类,则它应该是具有静态实用程序函数的类,而不是单例。 static和singleton类都可以实现线程安全。