【问题标题】:Difference between static function and singleton class in swift [closed]swift中静态函数和单例类之间的区别[关闭]
【发布时间】:2016-06-14 08:39:54
【问题描述】:

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

【问题讨论】:

    标签: ios swift singleton static-methods


    【解决方案1】:

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

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

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

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

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

    我希望这能让你清楚。

    【讨论】:

    • 需要明确的是,调用实例方法并不一定意味着使用动态调度。如果可以静态分派(例如方法标记为final,或者启用了整个模块优化),则单例上的实例方法可以具有完全相同的性能
    • 为什么不应该在实用程序类中设置异步任务?这会导致什么样的问题?
    • 我也有同样的问题,为什么不在 Utility 类中使​​用异步方法?
    【解决方案2】:

    假设我们有两个类。

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

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

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

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

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

    【讨论】:

    • 创建太多静态函数会影响应用性能吗?
    • 从技术上讲,您拥有的代码越多,可执行文件的大小就越大,并且会影响您的应用程序性能。但是,当您编写巨大的解决方案时,就会发生这种情况。在这种情况下,必须专注于通过不同的架构选择(可插入模块、服务、共享库等)来管理执行和运行时内存。但是大多数移动应用程序不属于这个标准,所以在大多数情况下它不是一个大问题。此外,实用程序类中单例与静态方法的性能影响也不会有任何不同。
    • 如果我们使用结构而不是类(具有所有静态函数和属性),您是否看到您的答案发生了某种变化?
    • 嗨劳尔。 C++ 中的结构和类本质上是相同的。我不确定您的问题是否与 switf 相关
    【解决方案3】:

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

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

    【讨论】:

    • 协议也可以在 Swift 和 Obj-C 中定义静态方法。静态方法也可以被继承,因为问题不是关于静态函数,而是关于具有静态成员的类。
    猜你喜欢
    • 2017-08-25
    • 2010-10-05
    • 2011-10-06
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多