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

Sun*_*rma 28 singleton static-methods ios swift

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

che*_*ras 29

可以说我们有两节课.

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

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

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

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

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


kan*_*aya 27

当然这听起来很混乱,可以辩论.但是,从最佳实践中我可以提出一些建议.

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

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

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

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

我希望这能让你清楚.

  • 为什么不在实用程序类中使用异步任务?这会引起什么样的问题? (7认同)
  • 需要明确的是,调用实例方法并不一定意味着使用动态调度.单例上的实例方法如果可以静态调度则可以具有完全相同的性能(例如,在方法标记为"final"的情况下,或者如果启用了整个模块优化) (2认同)

Vis*_*kar 7

static和之间的主要区别singletonSingleton可以实现Protocols并从某些基类派生.如果是Singleton,class可以实例化但只能实例化一次.Static函数可以直接使用而无需实例化.

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