【发布时间】:2016-06-14 08:39:54
【问题描述】:
我想创建一个类,其中将保留所有实用程序方法,并且这些方法将在整个应用程序中使用。
问题:1
创建一个单例类并在其中保留所有必要的方法是否很好,或者我应该创建一个所有函数都是静态的类。
问题:2
swift 中上述两种方法的主要区别是什么?
问题:3
它将如何影响 iOS 中的性能和内存?
【问题讨论】:
标签: ios swift singleton static-methods
我想创建一个类,其中将保留所有实用程序方法,并且这些方法将在整个应用程序中使用。
问题:1
创建一个单例类并在其中保留所有必要的方法是否很好,或者我应该创建一个所有函数都是静态的类。
问题:2
swift 中上述两种方法的主要区别是什么?
问题:3
它将如何影响 iOS 中的性能和内存?
【问题讨论】:
标签: ios swift singleton static-methods
当然,这听起来令人困惑,可以辩论。但是,从最佳实践中,我可以提出一些建议。
Singleton 通常用于创建资源密集型和一个计时器初始化,例如:数据库连接器、登录处理程序等。
实用类是只有静态函数和变量的类。它不应该处理异步任务和昂贵的资源处理,例如打开数据库连接器。
在您的情况下,如果实用程序正在执行一些资源密集型过程,最好将其包装在单例中。如果不是,那么我认为类中的静态函数会更好。这也是因为,Swift 将使用 static dispatch 来调度类中的所有静态函数。而这在 Singleton 中是不可能的,尽管 Swift 喜欢优化。
就使用 Objective-C 运行时而言,静态调度比动态调度快 4 倍。这对于 swift 也是如此。但是,Dynamiclly 调度只需要 4 纳秒。
我希望这能让你清楚。
【讨论】:
final,或者启用了整个模块优化),则单例上的实例方法可以具有完全相同的性能
假设我们有两个类。
包含所有静态方法和静态变量的类 这样您就可以在不实例化对象的情况下访问类方法。此外,如果需要一些小数据句柄,它们可以存储在静态变量中。所有访问此类的线程最终都不会创建重复的数据变量实例。
单例类 此类将具有私有 init 方法并通过静态实例共享单个实例。所有访问该实例的线程最终都不会创建重复的数据变量实例。
因此,从技术上讲,两者对于实用程序类的场景可能听起来非常相似,并且做出决定可能会让人感到困惑,您可以使用以下用例来做出决定。
这个类主要定义逻辑实现吗?如果类方法的主要目的是提供不需要将数据存储在临时句柄之外的变量中的逻辑计算/操作或操作,那么您应该始终选择静态类。例如您在此处提到的实用程序类。调整图像大小、读取文件、解析数据结构等实用方法最好使用静态方法。
如果您的班级需要将重要信息存储在多个变量中,限制资源访问(例如,限制数据库上的同时事务数量或限制同时网络调用的数量),它经常分配和取消分配资源(管理内存在运行时)然后最好使用单例类(例如用于访问数据库结构、管理网络资源等的类)
【讨论】:
static 和singleton 的主要区别在于Singleton 可以实现Protocols 并派生自一些基类。在Singleton 的情况下,可以实例化类,但只能实例化一次。 Static函数可以直接使用,无需实例化。
因此,如果您想为实用方法创建类,它应该是具有静态实用功能的类,而不是单例类。静态类和单例类都可以实现线程安全。
【讨论】: