Ios 关于内存消耗:为什么选择静态让渡(计算)静态var?
我的项目已经成长,我的扩展也在成长,它带有访问特定类型的实用方法。例如,Ios 关于内存消耗:为什么选择静态让渡(计算)静态var?,ios,swift,memory-management,Ios,Swift,Memory Management,我的项目已经成长,我的扩展也在成长,它带有访问特定类型的实用方法。例如,UINib的扩展如下: extension UINib { static let collectionViewCellNib1: UINib = UINib(nibName: "collectionViewCellNib1", bundle: Bundle.main) static let collectionViewCellNib2: UINib = UINib(nibName: "collectionViewCe
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.
}
由于myUINib
实例现在绑定到一个视图,该视图有自己的生命周期,因此当视图被销毁/删除时,所有连接到此生命周期的对象都将被释放
如果计算类型属性对内存消耗更有利,为什么我应该选择常量类型属性而不是计算类型属性?第二个计算属性示例(可能)会在每次获得属性时为您提供一个新的UINib。正确的做法是,当您使用完它们后,每个对象的内存都会被回收,但这可能会因为同时有多个代表同一个NIB的UINib对象而被抵消
另一个问题是,就CPU周期和IO而言,构造UINib是一项昂贵的操作(您必须读取磁盘上的文件,并根据其中的内容创建对象)。这可能会抵消较小内存占用的优势。虽然您似乎更喜欢常数类型属性解决方案,但您的回答表明,我的应用程序的体系结构表明,无论当前实现是否优于计算类型属性,对吗?@ezcoding在本例中,我会优先使用letproperty而不是computed属性,因为后者可能会带来性能损失。另外,我认为它更具可读性。你知道如何(快速)对其进行基准测试吗?我在考虑一个包含多个UIUnitTests和self.measure的测试项目,measure@ezcoding做两个度量测试,每个版本都有一个,在这个版本中,您可以多次访问属性。就我个人而言,我不会麻烦,我只会使用let属性,除非有一些明显的内存问题。