swift中静态函数和单例class的区别

Difference between static function and singleton class in swift

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

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

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

假设我们有两个 classes。

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

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

因此,从技术上讲,对于您的实用程序场景,两者听起来都非常相似 class 并且做出决定可能会造成混淆,您可以使用以下用例做出决定。

  • 这个class是否主要定义了逻辑实现?如果 class 方法的主要目的是提供逻辑 calculations/manipulations 或不需要将数据存储在临时句柄之外的变量中的操作,那么您应该始终选择静态 Class。例如您在此处提到的实用程序 class。调整图像大小、读取文件、解析数据结构等实用方法最好使用静态方法来完成。

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

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

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

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

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

就使用 Objective-C 运行时而言,静态调度比动态调度 快 4 倍。 swift 也是如此。然而,动态调度只需要 4 纳秒。

我希望这能让你明白。