【问题标题】:Static variables vs methods to store properties静态变量和存储属性的方法
【发布时间】:2021-06-08 21:51:50
【问题描述】:

在我的 SwiftUI 应用程序中,我目前正在使用一个全局结构,它包含颜色或大小等常量属性。 例如

struct App {
    struct Colors {
        static let mainAppColor: UIColor = UIColor(red: 233/255, green: 230/255, blue: 231/255)
        static let mainWhiteColorMiddleOpacity: UIColor = UIColor.white.opacity(0.5)
    }
}

// usage
struct ContentView: View {
    var body: some View {
        Rectangle().foregroundColor(App.Colors.mainBlueColor)
    }
}

我一直在争论这是否是一种不好的做法,因为我有很多静态变量,并且想知道用静态方法或计算属性替换它们是否会减少内存使用(因为 body 被计算了很多次)。例如。替换:

struct App {
    struct Colors {
        static var mainBlueColor: UIColor { UIColor.blue }
        static var mainWhiteColorMiddleOpacity: UIColor { UIColor.white.opacity(0.5) }
    }
}

// usage
struct ContentView: View {
    var body: some View {
        Rectangle().foregroundColor(App.Colors.mainBlueColor)
    }
}

一个会增加堆使用率,另一个会增加堆栈使用率,对吗? 您认为最佳做法是什么?

【问题讨论】:

    标签: ios swift memory-management swiftui


    【解决方案1】:

    过早(且构思不周)的优化。你可能不知道,在宏伟的计划中,甚至数千个这些值实际上占用了多少内存;这是微不足道的。任何写得体面的应用程序都会有很多;这就是你所做的。

    结构是组织和命名这些事物的好方法,尽管枚举现在是 Apple 的首选方式(出于我不完全理解的原因)。

    你的“因为身体被计算了很多次”是完全不相关的:名称是对值的直接引用,绝对没有开销,因为如果你使用let,整个东西都会被编译掉并替换为正确的值在您的代码中的参考点。运行时的查找时间为零!

    (另一方面,计算值或方法可能每次都需要一些严重的开销来运行,这可能会使整个消息分发机制发挥作用,尽管它实际上可能被内联了。那里严重倒退。)

    【讨论】:

      【解决方案2】:

      我会说永远不要将计算属性用于您已经知道答案或价值的事物,另一方面,您知道 SwiftUI 会运行多少次计算属性来使用它吗?为了得到同样的东西,有这么多运行代码!

      你可以在你的应用程序中使用计算属性一次或几次来读取值,例如你有一个知道宽度和高度的矩形,然后使用计算属性来获取区域,或其他东西像这样相关的,读完 value 后就完成了,也不需要存储了。

      【讨论】:

        【解决方案3】:

        计算属性仅在需要计算的情况下才有用,因此 variable 有意义。

        您肯定是在创建 constants(正如您所提到的),所以请使用 let

        关于内存使用:如何在资产目录中声明颜色?

        【讨论】:

        • 资产目录中的颜色是否较浅?
        • 资产目录是磁盘上的一个文件。它不消耗内存
        猜你喜欢
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        相关资源
        最近更新 更多