Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 关于内存消耗:为什么选择静态让渡(计算)静态var?_Ios_Swift_Memory Management - Fatal编程技术网

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.
}
由于my
UINib
实例现在绑定到一个视图,该视图有自己的生命周期,因此当视图被销毁/删除时,所有连接到此生命周期的对象都将被释放


如果计算类型属性对内存消耗更有利,为什么我应该选择常量类型属性而不是计算类型属性

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


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

虽然您似乎更喜欢常数类型属性解决方案,但您的回答表明,我的应用程序的体系结构表明,无论当前实现是否优于计算类型属性,对吗?@ezcoding在本例中,我会优先使用letproperty而不是computed属性,因为后者可能会带来性能损失。另外,我认为它更具可读性。你知道如何(快速)对其进行基准测试吗?我在考虑一个包含多个UIUnitTests和self.measure的测试项目,measure@ezcoding做两个度量测试,每个版本都有一个,在这个版本中,您可以多次访问属性。就我个人而言,我不会麻烦,我只会使用let属性,除非有一些明显的内存问题。