gpt4 book ai didi

ios - 关于内存消耗 : Why choose static let over (computed) static var?

转载 作者:搜寻专家 更新时间:2023-10-31 22:57:45 24 4
gpt4 key购买 nike

我的项目变大了,我的扩展也变大了,使用实用方法来访问某些类型。例如,我有一个 UINib 的扩展,如下所示:

extension UINib {
static let collectionViewCellNib1: UINib = UINib(nibName: "collectionViewCellNib1", bundle: Bundle.main)
static let collectionViewCellNib2: UINib = UINib(nibName: "collectionViewCellNib2", bundle: Bundle.main)
static let collectionViewCellNib3: UINib = UINib(nibName: "collectionViewCellNib3", bundle: Bundle.main)
// etc.
}

现在关于内存消耗:如果我理解正确,当我访问这些类型属性中的任何一个时,它不会被垃圾收集。只要我的应用程序存在/未终止,它就会保留在内存中。

如果我将上面的代码重构为:

extension UINib {
static var collectionViewCellNib1: UINib {
return UINib(nibName: "collectionViewCellNib1", bundle: Bundle.main)
}

static var collectionViewCellNib2: UINib {
return UINib(nibName: "collectionViewCellNib2", bundle: Bundle.main)
}

static var collectionViewCellNib3: UINib {
return UINib(nibName: "collectionViewCellNib3", bundle: Bundle.main)
}
// etc.
}

因为我的 UINib 实例现在绑定(bind)到一个 View ,它有自己的生命周期,当 View 被销毁/删除时,所有连接到这个生命周期的对象都将被释放。

为什么我应该选择常量类型属性而不是计算类型属性,如果后者更适合内存消耗?

最佳答案

具有计算属性的第二个示例将(可能)在您每次获取属性时为您提供一个新的 UINib。正确的是,当您使用完它们时,每个内存都将被回收,但这可能会被多个 UINib 对象同时表示相同的 NIB 所抵消。

另一个问题是构建 UINib 在 CPU 周期和 IO 方面是一项昂贵的操作(您必须读取磁盘上的文件并根据其中的内容创建对象)。这可能会抵消更小内存占用的优势。

关于ios - 关于内存消耗 : Why choose static let over (computed) static var?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42674223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com